Создайте Windows Communications Foundation Based Components

Прежде, чем запустить пример

Прежде, чем запустить этот пример, помните о следующем:

  • Необходимо запускать, по крайней мере, Microsoft®.NET Framework 3.5, чтобы использовать функцию WCF.

  • Если вы хотите использовать WCF, самый легкий способ сделать так через безопасный с точки зрения типов API.

  • WCF и Дистанционная работа.NET не совместимы в том же проекте развертывания или компоненте.

  • Пример в этой главе требует, чтобы оба клиент-сервера использовали размеры сообщения, больше, чем значения по умолчанию WCF. Для получения информации об изменении размера сообщения по умолчанию см., что статья MSDN расценивает установку свойства maxreceivedmessagesize.

Развертывание основанного на WCF компонента

Развертывание основанного на WCF компонента требует экспертных знаний Разработчика.NET, потому что это требует выполнения многих усовершенствованных задач программирования.

Чтобы развернуть основанный на WCF компонент, следуйте за этим общим рабочим процессом:

Запишите и протестируйте свой код MATLAB

Создайте свою программу MATLAB® и затем протестируйте код прежде, чем реализовать безопасный с точки зрения типов интерфейс. Функции в вашей программе MATLAB должны совпадать с объявлениями в вашем нативном интерфейсе.NET.

В следующем примере развертываемый код MATLAB содержит тот экспортируемая функция, addOne. Функция addOne добавляет значение один (1) в полученный вход. Вход должен быть числовым, или скаляр или матрица сингла или нескольких размерностей.

function y = addOne(x)
% ADDONE Add one to numeric input. Input must be numeric.

    if ~isnumeric(x)
        error('Input must be numeric. Input was %s.', class(x));
    end
    y = x + 1;

end

Примечание

addOne должен выполнить проверку типа выполнения, чтобы гарантировать допустимый вход.

Разработайте свой интерфейс WCF

После того, как вы запишете и протестируете свой код MATLAB, разработаете интерфейс или в C# или в Visual Basic, который поддерживает нативные типы через API.

Задайте Перегрузки IAddOne.  Смотрите Реализацию Безопасный с точки зрения типов Интерфейс для полных правил об определении интерфейсных перегрузок.

Кроме того, при использовании WCF, ваши перегруженные функции должны иметь уникальные имена.

Обратите внимание на то, что в реализации WCF addOne, вы украшаете методы свойством OperationContract. Вы даете каждому методу уникальное имя операции, которое вы задаете со свойством Name OperationContract, как в этом примере:

using System.ServiceModel;

[ServiceContract]
public interface IAddOne
{
    [OperationContract(Name = "addOne_1")]
    int addOne(int x);

    [OperationContract(Name = "addOne_2")]
    void addOne(ref int y, int x);

    [OperationContract(Name = "addOne_3")]
    void addOne(int x, ref int y);

    [OperationContract(Name = "addOne_4")]
    System.Double addOne(System.Double x);

    [OperationContract(Name = "addOne_5")]
    System.Double[] addOne(System.Double[] x);

    [OperationContract(Name = "addOne_6")]
    System.Double[][] addOne(System.Double[][] x);
}

Как вы видите, интерфейс IAddOne задает шесть перегрузок функции addOne. Кроме того, заметьте, что у всех есть вход того и один вывод (чтобы совпадать с функцией addOne MATLAB), хотя тип и положение этих параметров отличаются.

Для отрывков дополнительного кода и правил преобразования данных относительно безопасных с точки зрения типов интерфейсов, смотрите Реализацию Безопасный с точки зрения типов Интерфейс.

Для актуальной информации относительно WCF смотрите то, Что Является Windows Communication Foundation на веб-странице Microsoft.

Скомпилируйте IAddOne в блок.  Скомпилируйте IAddOne.cs в блок с помощью Microsoft Visual Studio®.

Примечание

Этот пример принимает, что ваш блок содержит только IAddOne. Реалистично, более вероятно, что IAddOne уже будет частью скомпилированного блока. Блок может быть завершен даже, прежде чем функция MATLAB записана.

Создайте свой компонент и сгенерируйте ваш безопасный с точки зрения типов API

Используйте или приложение Library Compiler или инструменты командной строки развертывания, чтобы сгенерировать безопасный с точки зрения типов API.

Используя Library Compiler.  Приложение Library Compiler генерирует безопасный с точки зрения типов API, когда вы создаете свой компонент, если правильные опции выбраны.

  1. Создайте свой проект.

    При определении проекта используйте эти значения:

    Название проектаAddOneComp
    ClassName Mechanism
    Файл, чтобы скомпилироватьaddOne

    Примечание

    Не нажимайте кнопку Package в это время.

  2. Расширьте раздел Additional Runtime Settings.

  3. На вкладке Type-Safe API сделайте следующее:

    1. Выберите Enable Type-Safe API.

    2. В поле Interface assembly задайте местоположение блока интерфейса type-safe/WCF, который вы создали.

    3. Выберите IAddOne из .NET interface выпадающее поле. Интерфейсное имя обычно снабжается префиксом I.

      Совет

      Если выпадающим является пробел, приложение Library Compiler, возможно, не могло найти любые интерфейсы.NET в блоке, который вы выбрали. Выберите другой блок.

    4. Задайте Mechanism как имя класса, которое вы хотите, чтобы сгенерированный API перенес в поле Wrapped Class.

    Примечание

    Оставьте незаполненное поле Namespace.

  4. Разработайте проект, как обычно, путем нажатия кнопки Package.

Используя Инструменты Командной строки Развертывания.  Чтобы сгенерировать безопасный с точки зрения типов API с вашей сборкой компонента (компиляция) с помощью mcc, сделайте следующее:

  1. Создайте компонент путем ввода этой команды из MATLAB:

    mcc -v -B 'dotnet:AddOneComp,Mechanism,3.5,private,local'
                                                      addOne
    

    Смотрите страницу с описанием mcc в этом для получения дополнительной информации о заданных опциях.

  2. Сгенерируйте безопасный с точки зрения типов API путем ввода этой команды из MATLAB:

    ntswrap -c AddOneComp.Mechanism -i IAddOne -a IAddOne.dll

    где:

    • -c задает полностью определенное имя пространства имен блока MATLAB Compiler SDK™, чтобы перенестись с безопасным с точки зрения типов API. Если компонент ограничен по объему к пространству имен, задайте полное полностью определенное имя пространства имен (AddOneComp.Mechanism в примере). Поскольку никакое пространство имен не задано ntswrap, безопасный с точки зрения типов интерфейсный класс появляется в глобальном пространстве имен.

    • -i задает имя интерфейса.NET, который задает безопасный с точки зрения типов API. Интерфейсное имя обычно снабжается префиксом I.

    • -a задает абсолютный или относительный путь к блоку, содержащему.NET интерфейс со статическим контролем типов, на который ссылается переключатель -i.

      Совет

      Если блок, содержащий интерфейс IAddOne.NET, не находится в текущей папке, задайте полный путь.

    Внимание

    Не все аргументы совместимы друг с другом. Смотрите страницу с описанием ntswrap для деталей обо всех опциях команды.

Разработайте программу сервера Используя интерфейс WCF

Вы теперь создали свой компонент и сгенерировали WCF-совместимый безопасный с точки зрения типов API.

Затем, разработайте программу сервера, которая обеспечивает доступ (через WCFServiceContract) к перегрузкам addOne, заданного интерфейсом WCF IAddOne. Программа ссылается на конфигурационный XML-файл App.config.

Загрузки программы сервера WCF основанный на WCF компонент addOne.Mechanism и делают его доступным для клиентов SOAP через безопасный с точки зрения типов интерфейс mechanismIAddOne.

О зубчатой обработке матриц

При записи интерфейса вы будете кодировать, чтобы обработать зубчатые массивы, в противоположность прямоугольным массивам. Для получения дополнительной информации о зубчатых массивах, смотрите Зубчатую Обработку матриц в этой документации.

 Программа сервера WCF

 XML-файл App.config

Скомпилируйте программу сервера

Скомпилируйте программу сервера с помощью Microsoft Visual Studio путем выполнения следующего:

  1. Создайте проект Microsoft Visual Studio под названием AddMaster.

  2. Добавьте AddMasterServer.cs и App.config (конфигурационный файл, созданный на предыдущем шаге) к вашему проекту.

  3. Добавьте ссылки в проекте к следующим файлам.

    Эта ссылка:Задает:
    IAddOne.dllСобственный компонент.NET вводит интерфейс IAddOne
    MechanismIAddOne.dllСгенерированный безопасный с точки зрения типов API
    AddOneCompNative.dllСгенерированный блок

    Примечание

    В отличие от других сценариев развертывания.NET, вы не должны ссылаться на MWArray.dll в исходном коде программы сервера. Типы данных MWArray скрыты позади безопасного с точки зрения типов API в MechanismIAddOne.

  4. Если вы уже не ссылаетесь на System.ServiceModel, добавьте его в свой проект Visual Studio.

  5. Скомпилируйте программу с Microsoft Visual Studio.

Запустите программу сервера

Запустите программу сервера из командной строки.

Вывод должен выглядеть подобным следующему.

AddMaster Server is up running......
Press any key to close the service.

Нажатие ключа приводит к следующему.

Closing service....

Сгенерируйте код прокси для клиентов

Сконфигурируйте свои клиенты, чтобы связаться с сервером путем выполнения автоматического инструмента генерации прокси, svcutil.exe. Большинство версий Microsoft Visual Studio может автоматически сгенерировать клиентский код прокси от метаданных сервера.

Внимание

Прежде чем вы сгенерируете свой клиентский код прокси с помощью этого шага, сервер должен быть доступным и рабочим. В противном случае клиент не найдет сервер.

  1. Создайте клиентский проект в Microsoft Visual Studio.

  2. Добавьте ссылки при помощи любого из этих двух методов. Смотрите Резервирование Порта и Используя localhost 8001 для получения информации об изменении конфигураций порта.

    Метод 1Метод 2
    1. В панели Проводника Решений щелкните правой кнопкой по References.

    2. Выберите Add Service Reference. Диалоговое окно Add Service Reference появляется.

    3. В поле Address, введите: http://localhost:8001/AddMaster/

      Примечание

      Обязательно включайте / после AddMaster.

    4. В поле Namespace введите AddMasterProxy.

    5. Нажмите OK.

    1. Введите следующую команду из своей директории клиентского приложения, чтобы сгенерировать AddMasterProxy.cs, который содержит клиентский код прокси. Эта команда также генерирует конфигурационный файл App.config.svcutil.exe /t:code http://localhost:8001/AddMaster//out:AddMasterProxy.cs /config:App.config

      Примечание

      Введите вышеупомянутую команду в одну строку без пропусков.

    2. Добавьте AddMasterProxy.cs и App.config к вашему клиентскому проекту

Резервирование порта и Используя localhost 8001.  При выполнении самоприложения хоста можно столкнуться с проблемами с резервированием порта. Используйте один из инструментов ниже, чтобы изменить ваши конфигурации порта по мере необходимости.

если Вы Выполнение....Используйте этот инструмент, чтобы изменить конфигурации порта....
Windows® XPhttpcfg
Windows Vista™netsh
Windows 7netsh

Скомпилируйте клиентскую программу

Клиентская программа отличается от программы сервера AddMaster.cs можно следующим образом:

  • При запуске эта программа соединяется с AddMasterService, обеспеченным сервисом WCF AddMaster.

  • Вместо того, чтобы непосредственно вызвать методы безопасного с точки зрения типов интерфейса IAddOne механизма, клиент WCF использует имена методов, заданные в атрибутах OperationContract IAddOne.

Скомпилируйте клиентскую программу путем выполнения следующего:

  1. Добавьте клиентский код (AddMasterClient.cs) в ваш проект Microsoft Visual Studio.

  2. Если вы уже не ссылаетесь на System.ServiceModel, добавьте его в свой проект Visual Studio.

  3. Скомпилируйте клиентскую программу WCF в Visual Studio.

     Клиентская программа WCF

Запустите клиентскую программу

Запустите клиентскую программу из командной строки.

Вывод должен быть подобен следующему:

Conntecting to AddMaster Service through Http connection...
Conntected to AddMaster Service...
addOne(1) = 2
addOne(16) = 17
addOne(2) = 3
addOne(495) = 496
addOne([30 60 88]) = [31 61 89]
addOne([0 2; 3 1]) = [1 3; 4 2]
Press any key to close the client application.

Нажатие ключа приводит к следующему.

Closing client....