Прежде чем запускать этот пример, имейте в виду следующее:
Вы должны работать по крайней мере с Microsoft® .NET Framework 3.5 для использования функции WCF.
Если вы хотите использовать WCF, самый легкий способ сделать это - через безопасный для типа API.
WCF и .NET Remoting не совместимы в одном проекте развертывания или компоненте.
Пример в этой главе требует, чтобы и клиент, и сервер использовали размеры сообщений, большие, чем значения WCF по умолчанию. Для получения информации об изменении размера сообщения по умолчанию смотрите статью MSDN, касающуюся настройки maxreceivedmessagesize
свойство.
Развертывание компонента на основе WCF требует опыта разработчика .NET, поскольку он требует выполнения ряда сложных задач программирования.
Чтобы развернуть компонент на основе WCF, следуйте этому общему рабочему процессу:
Создайте свой компонент и сгенерируйте безопасный API-интерфейс
Разрабатывайте серверную программу с использованием интерфейса WCF
Создайте свой 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
Для проверки допустимого входного сигнала необходимо выполнить проверку типа входа.
После записи и тестирования кода 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, используйте приложение Library Compiler или инструменты командной строки развертывания.
Использование Library Compiler. Приложение Library Compiler генерирует безопасный для типа API, когда вы создаете свой компонент, если выбраны правильные опции.
Создайте свой проект.
При определении своего проекта используйте следующие значения:
Имя проекта | AddOneComp |
Имя класса | Mechanism |
Файл для компиляции | addOne |
Примечание
В настоящее время не нажимайте кнопку Package.
Разверните раздел Additional Runtime Settings.
На вкладке Type-Safe API выполните следующие действия:
Выберите Enable Type-Safe API.
В поле Interface assembly укажите местоположение созданной сборки интерфейса type-safe/WCF.
Выберите IAddOne
из раскрывающегося списка .NET interface. Имя интерфейса обычно префиксируется I
.
Совет
Если выпадающий список пуст, приложению Library Compiler не удалось найти интерфейсы .NET в выбранной сборке. Выберите другую сборку.
Задайте Mechanism
, как имя класса, которое вы хотите перенести сгенерированный API, в поле Wrapped Class.
Примечание
Оставьте поле Namespace пустым.
Создайте проект как обычно, нажав кнопку Package.
Использование инструментов командной строки развертывания. Чтобы сгенерировать API с безопасным типом с помощью сборки (компиляции) вашего компонента mcc
, выполните следующее:
Создайте компонент путем ввода этой команды из MATLAB:
mcc -v -B 'dotnet:AddOneComp,Mechanism,3.5,private,local' addOne
См. mcc
Страница с описанием в этом для получения дополнительной информации об заданных опциях.
Сгенерируйте 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
Страница с описанием для получения дополнительной информации обо всех командных опциях.
Теперь вы создали свой компонент и сгенерировали API, отвечающий требованиям WCF.
Далее разработайте серверную программу, которая обеспечивает доступ (через WCFServiceContract
) к перегрузкам addOne
определяется WCF IAddOne
интерфейс. Программа ссылается на App.config
Строение XML.
Программа сервера WCF загружает addOne.Mechanism на основе WCF
Компонент и делает его доступным для клиентов SOAP через безопасную mechanismIAddOne
интерфейс.
Сведения о обработке Jagged Array
При записи интерфейса вы будете кодировать для обработки зубчатых массивов, в отличие от прямоугольных массивов. Для получения дополнительной информации о jagged массивы. Jagged Array Processing в этой документации.
XML- файл App.config
Скомпилируйте серверную программу с помощью Microsoft Visual Studio, выполнив следующее:
Создайте проект Microsoft Visual Studio с именем AddMaster
.
Добавить AddMasterServer.cs
и App.config
(файл строения, созданный на предыдущем шаге) к вашему проекту.
Добавьте ссылки в проект к следующим файлам.
Эта ссылка: | Определяет: |
---|---|
IAddOne.dll | Интерфейс native type .NET IAddOne |
MechanismIAddOne.dll | Сгенерированный API type-safe |
AddOneCompNative.dll | Сгенерированная сборка |
Примечание
В отличие от других сценариев развертывания .NET, ссылаться на MWArray.dll
в исходном коде серверной программы. The MWArray
типы данных скрыты за API с безопасным типом в MechanismIAddOne
.
Если вы еще не ссылаетесь на System.ServiceModel
, добавьте его к своему проекту Visual Studio.
Скомпилируйте программу с помощью Microsoft Visual Studio.
Запустите серверную программу из командной строки.
Выходы должны выглядеть аналогично следующим.
AddMaster Server is up running...... Press any key to close the service.
Нажатие клавиши приводит к следующему.
Closing service....
Сконфигурируйте своих клиентов для связи с сервером путем запуска автоматического инструмента генерации прокси-сервера, svcutil.exe
. Большинство версий Microsoft Visual Studio может автоматически генерировать прокси кода клиента из метаданных сервера.
Внимание
Прежде чем вы сгенерируете прокси кода клиента с помощью этого шага, сервер должен быть доступен и запущен. В противном случае клиент не найдет сервер.
Создайте клиентский проект в Microsoft Visual Studio.
Добавьте ссылки с помощью одного из этих двух методов. Смотрите разделы Резервирование портов и Использование localhost 8001 для получения информации об изменении строений портов.
Метод 1 | Метод 2 |
---|---|
|
|
Резервирование портов и использование localhost 8001. При запуске автономного приложения могут возникнуть проблемы с резервированием портов. При необходимости измените строения портов одним из приведенных ниже инструментов.
Если вы бежите.... | Используйте этот инструмент для изменения строений портов.... |
---|---|
Windows® XP | httpcfg |
Система Windows Vista™ | netsh |
Windows 7 | netsh |
Клиентская программа отличается от AddMaster.cs
серверная программа следующим образом:
При запуске эта программа соединяется с AddMasterService
предоставляется AddMaster
Услуга WCF.
Вместо прямого вызова методов безопасного для типа механизма IAddOne
интерфейс, WCF-клиент использует имена методов, заданные в OperationContract
атрибуты IAddOne
.
Скомпилируйте клиентскую программу, выполнив следующее:
Добавьте код клиента (AddMasterClient.cs
) к вашему проекту Microsoft Visual Studio.
Если вы еще не ссылаетесь на System.ServiceModel
, добавьте его к своему проекту Visual Studio.
Скомпилируйте программу клиента WCF в Visual Studio.
Запустите клиентскую программу из командной строки.
Выходные выходы должны быть аналогичны следующим:
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....