Прежде, чем запустить этот пример, помните о следующем:
Необходимо запускать, по крайней мере, Microsoft®.NET Framework 3.5, чтобы использовать функцию WCF.
Если вы хотите использовать WCF, самый легкий способ сделать так через безопасный с точки зрения типов API.
WCF и Дистанционная работа.NET не совместимы в том же проекте развертывания или компоненте.
Пример в этой главе требует, чтобы оба клиент-сервера использовали размеры сообщения, больше, чем значения по умолчанию WCF. Для получения информации об изменении размера сообщения по умолчанию см., что статья MSDN расценивает установку maxreceivedmessagesize
свойство.
Развертывание основанного на WCF компонента требует экспертных знаний Разработчика.NET, потому что это требует выполнения многих усовершенствованных задач программирования.
Чтобы развернуть основанный на WCF компонент, следуйте за этим общим рабочим процессом:
Создайте свою программу 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
должен выполнить проверку типа выполнения, чтобы гарантировать допустимый вход.
После того, как вы запишете и протестируете свой код 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 записана.
Используйте или приложение Library Compiler или инструменты командной строки развертывания, чтобы сгенерировать безопасный с точки зрения типов API.
Используя Library Compiler. Приложение Library Compiler генерирует безопасный с точки зрения типов API, когда вы создаете свой компонент, если правильные опции выбраны.
Создайте свой проект.
При определении проекта используйте эти значения:
Название проекта | AddOneComp |
ClassName | 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
, безопасный с точки зрения типов интерфейсный класс появляется в глобальном пространстве имен.
-i
задает имя интерфейса.NET, который задает безопасный с точки зрения типов API. Интерфейсное имя обычно снабжается префиксом I
.
-a
задает абсолютный или относительный путь к блоку, содержащему.NET интерфейс со статическим контролем типов, на который ссылается -i
переключатель.
Совет
Если блок, содержащий интерфейс IAddOne
.NET не находится в текущей папке, задайте полный путь.
Внимание
Не все аргументы совместимы друг с другом. Смотрите ntswrap
страница с описанием для деталей обо всех опциях команды.
Вы теперь создали свой компонент и сгенерировали WCF-совместимый безопасный с точки зрения типов API.
Затем разработайте программу сервера, которая обеспечивает доступ (через WCFServiceContract
) к перегрузкам addOne
заданный IAddOne
WCF интерфейс. Программа ссылается
на App.config
Конфигурационный XML-файл.
Загрузки программы сервера WCF основанный на WCF addOne.Mechanism
компонент и делает его доступным для клиентов SOAP через безопасный с точки зрения типов mechanismIAddOne
интерфейс.
О зубчатой обработке матриц
При записи интерфейса вы будете кодировать, чтобы обработать зубчатые массивы, в противоположность прямоугольным массивам. Для получения дополнительной информации о зубчатых массивах, смотрите Зубчатую Обработку матриц в этой документации.
Скомпилируйте программу сервера с помощью Microsoft Visual Studio путем выполнения следующего:
Создайте проект Microsoft Visual Studio под названием AddMaster
.
Добавьте AddMasterServer.cs
и App.config
(конфигурационный файл, созданный на предыдущем шаге) к вашему проекту.
Добавьте ссылки в проекте к следующим файлам.
Эта ссылка: | Задает: |
---|---|
IAddOne.dll | Собственный компонент.NET вводит интерфейс IAddOne |
MechanismIAddOne.dll | Сгенерированный безопасный с точки зрения типов API |
AddOneCompNative.dll | Сгенерированный блок |
Примечание
В отличие от других сценариев развертывания.NET, вы не должны ссылаться на MWArray.dll
в исходном коде программы сервера. 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....