Создание компонентов на основе Windows Communications Foundation

Перед выполнением примера

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

  • Вы должны работать по крайней мере с Microsoft® .NET Framework 3.5 для использования функции WCF.

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

  • WCF и .NET Remoting не совместимы в одном проекте развертывания или компоненте.

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

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

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

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

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

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

В следующем примере развертываемый код MATLAB содержит одну экспортированную функцию, addOne. The addOne функция добавляет значение one (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 функция. Кроме того, заметьте, что все имеют один вход и один выход (чтобы соответствовать MATLAB addOne function), хотя тип и положение этих параметров изменяются.

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

Актуальные сведения о WCF см. в разделе «Что такое Windows Communication Foundation» на веб-странице корпорации Майкрософт.

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

Примечание

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

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

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

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

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

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

    Имя проектаAddOneComp
    Имя класса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Класс type-safe interface появляется в глобальном пространстве имен.

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

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

      Совет

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

    Внимание

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

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

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

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

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

Сведения о обработке Jagged Array

При записи интерфейса вы будете кодировать для обработки зубчатых массивов, в отличие от прямоугольных массивов. Для получения дополнительной информации о jagged массивы. Jagged Array Processing в этой документации.

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

XML-  файл App.config

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

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

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

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

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

    Эта ссылка:Определяет:
    IAddOne.dllИнтерфейс native type .NET IAddOne
    MechanismIAddOne.dllСгенерированный API type-safe
    AddOneCompNative.dllСгенерированная сборка

    Примечание

    В отличие от других сценариев развертывания .NET, ссылаться на MWArray.dll в исходном коде серверной программы. The 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. На панели Solutions Explorer щелкните правой кнопкой мыши 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 предоставляется AddMaster Услуга WCF.

  • Вместо прямого вызова методов безопасного для типа механизма 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....