Прежде, чем запустить этот пример, помните о следующем:
Необходимо запускать, по крайней мере, 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
, заданного интерфейсом WCF IAddOne
. Программа ссылается на конфигурационный XML-файл App.config
.
Загрузки программы сервера 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
, обеспеченным сервисом WCF AddMaster
.
Вместо того, чтобы непосредственно вызвать методы безопасного с точки зрения типов интерфейса 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....