Использование представлений .NET MATLAB® struct и массивы ячеек рекомендованы, если оба из них true:
У вас есть функции MATLAB на сервере с типами данных struct или камера в качестве входов или выходов
Вы не хотите или не должны устанавливать MATLAB Runtime на свои клиентские компьютеры
Родной MWArray
, MWStructArray
, и MWCellArray
классы являются представителями MathWorks.MATLAB.NET.Arrays.native
пространство имен.
Имена классов в этом пространстве имен идентичны именам классов в MathWorks.MATLAB.NET.Arrays
. Различие, что собственные представления struct и массивов ячеек не имеют методов или свойств, которые требуют MATLAB Runtime.
The
папка имеет примеры решений, которые вы можете практиковать создание. The matlabroot
\ toolbox\dotnetbuilder\Примеры\VS Version
\ NETNativeStructCellExample
папка содержит примеры собственного struct и камер.
Этот пример демонстрирует, как развернуть удаляемый компонент с помощью собственного struct и массивов ячеек. Прежде чем настраивать удаляемый код клиента и сервера, создайте удаляемый компонент.
Если компонент, который вы хотите развернуть, еще не построен, см. инструкции в разделе Создание удаляемого компонента с помощью приложения Library Compiler или Создание удаляемого компонента с помощью команды mcc.
В серверном приложении размещен удаленный компонент.
Клиентское приложение, выполняемое в отдельном процессе, получает доступ к удаленному компоненту, размещенному в серверном приложении. Создайте сервер с помощью Microsoft® Визуальная студия® файл проекта NativeStructCellServer.csproj
:
Измените ссылки для сгенерированной сборки компонента на
.component_name
\ для _ redistribution _ файлы _ only\ component_name
Native.dll
Выберите соответствующую платформу сборки.
Выберите Debug или Release режим.
Создайте NativeStructCellServer
проект.
Предоставьте файл строения для NativeStructCellServer
. Код C # для сервера находится в файле NativeStructCellServer.cs
:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; namespace NativeStructCellServer { class NativeStructCellServer { static void Main(string[] args) { RemotingConfiguration.Configure( @"NativeStructCellServer.exe.config"); Console.WriteLine("NativeStructCell Server started..."); Console.ReadLine(); } } }
Имя компонента, который будет размещен
Протокол удаленного взаимодействия и форматирование сообщений для использования
Время аренды удаленного компонента
В сложение, код также сигнализирует о том, что сервер активен и ждет возврата каретки перед завершением.
Клиентское приложение, выполняемое в отдельном процессе, получает доступ к удаленному компоненту, работающему в серверном приложении, созданном в примере Native .NET Cell и Struct. Создайте удаленный клиент с помощью файла проекта Microsoft Visual Studio NativeStructCellClient\NativeStructCellClient.csproj
. Чтобы создать удаленный клиент с помощью Microsoft Visual Studio:
Измените ссылки для сгенерированной сборки компонента на
.component_name
\ для _ redistribution _ файлы _ only\ component_name
Native.dll
Измените ссылки для сгенерированной сборки интерфейса на
.component_name
\ для _ redistribution _ файлы _ only\I component_name
Native.dll
Выберите соответствующую платформу сборки.
Выберите Debug или Release режим.
Создайте NativeStructCellClient
проект.
Предоставьте файл строения для NativeStructCellClient
.
Код C # для клиента находится в файле NativeStructCellClient\NativeStructCellClient.cs
:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Configuration; using MathWorks.MATLAB.NET.Arrays.native; using INativeStructCellCompNative; // This is a simple example that demonstrates the use // of MathWorks.MATLAB.NET.Arrays.native package. namespace NativeStructCellClient { class NativeStructCellClient { static void Main(string[] args) { try { RemotingConfiguration.Configure( @"NativeStructCellClient.exe.config"); String urlServer = ConfigurationSettings.AppSettings["NativeStructCellServer"]; INativeStructCellClassNative nativeStructCell = (INativeStructCellClassNative)Activator.GetObject(typeof (INativeStructCellClassNative), urlServer); MWCellArray field_names = new MWCellArray(1, 2); field_names[1, 1] = "Name"; field_names[1, 2] = "Address"; Object[] o = nativeStructCell.createEmptyStruct(1,field_names); MWStructArray S1 = (MWStructArray)o[0]; Console.WriteLine("\nEVENT 2: Initialized structure as received in client applications:\n\n{0}" , S1); //Convert "Name" value from char[,] to a string since there's no MWCharArray constructor on server that accepts //char[,] as input. char c = ((char[,])S1["Name"])[0, 0]; S1["Name"] = c.ToString(); MWStructArray address = new MWStructArray(new int[] { 1, 1 }, new String[] { "Street", "City", "State", "Zip" }); address["Street", 1] = "3, Apple Hill Drive"; address["City", 1] = "Natick"; address["State", 1] = "MA"; address["Zip", 1] = "01760"; Console.WriteLine("\nUpdating the 'Address' field to :\n\n{0}", address); Console.WriteLine("\n#################################\n"); S1["Address",1] = address; Object[] o1 = nativeStructCell.updateField(1, S1, "Name"); MWStructArray S2 = (MWStructArray)o1[0]; Console.WriteLine("\nEVENT 5: Final structure as received by client:\n\n{0}" , S2); Console.WriteLine("\nAddress field: \n\n{0}" , S2["Address",1]); Console.WriteLine("\n#################################\n"); } catch (Exception exception) { Console.WriteLine(exception.Message); } Console.ReadLine(); } } }
Этот код делает следующее:
Клиент считывает связанный файл строения, чтобы получить имя и местоположение удаляемого компонента.
Клиент создает экземпляры удаляемого объекта с помощью статического Activator.GetObject
метод
С этого момента удаленный клиент вызывает методы на удаляемом компоненте так же, как и локальный метод компонента.
Файл строения для NativeStructCellClient
находится в файле NativeStructCellClient\NativeStructCellClient.exe.config
:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="NativeStructCellServer" value= "tcp://localhost:1236/NativeStructCellClass.remote"/> </appSettings> <system.runtime.remoting> <application> <channels> <channel name="NativeStructCellChannel" ref="tcp" port="0"> <clientProviders> <formatter ref="binary" /> </clientProviders> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration>
Этот код задает:
Имя удаленного сервера компонентов и URI удаленного компонента (унифицированный идентификатор ресурса)
Протокол удаленного взаимодействия (TCP/IP
) и номер порта
Форматтер сообщений (binary
) и разрешения для канала связи (full
доверие)
Запустите сервер, выполнив следующие действия:
Откройте DOS или UNIX® командное окно и cd
на NativeStructCellServer\bin\x86\v4.0\Debug
.
Выполняйте NativeStructCellServer.exe
. Появится следующий выход:
EVENT 1: Initializing the structure on server and sending it to client: Initialized empty structure: Name: ' ' Address: [] ################################## EVENT 3: Partially initialized structure as received by server: Name: ' ' Address: [1x1 struct] Address field as initialized from the client: Street: '3, Apple Hill Drive' City: 'Natick' State: 'MA' Zip: '01760' ################################## EVENT 4: Updating 'Name' field before sending the structure back to the client: Name: 'The MathWorks' Address: [1x1 struct] ##################################
Запустите клиент, выполнив следующие действия:
Откройте командное окно DOS или UNIX и cd
на NativeStructCellClient\bin\x86\v4.0\Debug
.
Выполняйте NativeStructCellClient.exe
. После инициализации MATLAB Runtime появляется следующий выход:
EVENT 2: Initialized structure as received in client applications: 1x1 struct array with fields: Name Address Updating the 'Address' field to : 1x1 struct array with fields: Street City State Zip ################################# EVENT 5: Final structure as received by client: 1x1 struct array with fields: Name Address Address field: 1x1 struct array with fields: Street City State Zip #################################
Инициализируйте структуру на сервере и отправьте ее клиенту со следующим кодом MATLAB:
function PartialStruct = createEmptyStruct(field_names) fprintf('EVENT 1: Initializing the structure on server and sending it to client:\n'); PartialStruct = struct(field_names{1},' ',field_names{2},[]); fprintf(' Initialized empty structure:\n\n'); disp(PartialStruct); fprintf('\n##################################\n');
Получите частично обновленную структуру от клиента и добавьте к ней больше данных, прежде чем передать ее обратно клиенту со следующим кодом MATLAB:
function FinalStruct = updateField(st,field_name) fprintf('\nEVENT 3: Partially initialized structure as received by server:\n\n'); disp(st); fprintf('Address field as initialized from the client:\n\n'); disp(st.Address); fprintf('##################################\n'); fprintf(['\nEVENT 4: Updating ''', field_name, ''' field before sending the structure back to the client:\n\n']); st.(field_name) = 'The MathWorks'; FinalStruct = st; disp(FinalStruct); fprintf('\n##################################\n');
Создайте код C # клиента:
Примечание
В этом случае вам не нужна MATLAB Runtime на системном пути.
using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Configuration; using MathWorks.MATLAB.NET.Arrays.native; using INativeStructCellCompNative; // This is a simple example that demonstrates the use of // MathWorks.MATLAB.NET.Arrays.native package. namespace NativeStructCellClient { class NativeStructCellClient { static void Main(string[] args) { try { RemotingConfiguration.Configure (@"NativeStructCellClient.exe.config"); String urlServer = ConfigurationSettings.AppSettings[ "NativeStructCellServer"]; INativeStructCellClassNative nativeStructCell = (INativeStructCellClassNative)Activator.GetObject(typeof (INativeStructCellClassNative), urlServer); MWCellArray field_names = new MWCellArray(1, 2); field_names[1, 1] = "Name"; field_names[1, 2] = "Address"; Object[] o = nativeStructCell.createEmptyStruct(1,field_names); MWStructArray S1 = (MWStructArray)o[0]; Console.WriteLine("\nEVENT 2: Initialized structure as received in client applications:\n\n{0}" , S1); //Convert "Name" value from char[,] to a string since // there's no MWCharArray constructor // on server that accepts char[,] as input. char c = ((char[,])S1["Name"])[0, 0]; S1["Name"] = c.ToString(); MWStructArray address = want new MWStructArray(new int[] { 1, 1 }, new String[] { "Street", "City", "State", "Zip" }); address["Street", 1] = "3, Apple Hill Drive"; address["City", 1] = "Natick"; address["State", 1] = "MA"; address["Zip", 1] = "01760"; Console.WriteLine("\nUpdating the 'Address' field to :\n\n{0}", address); Console.WriteLine("\n#################################\n"); S1["Address",1] = address; Object[] o1 = nativeStructCell.updateField(1, S1, "Name"); MWStructArray S2 = (MWStructArray)o1[0]; Console.WriteLine("\nEVENT 5: Final structure as received by client:\n\n{0}" , S2); Console.WriteLine("\nAddress field: \n\n{0}" , S2["Address",1]); Console.WriteLine("\n#################################\n"); } catch (Exception exception) { Console.WriteLine(exception.Message); } Console.ReadLine(); } } }
Создайте код сервера C #:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; namespace NativeStructCellServer { class NativeStructCellServer { static void Main(string[] args) { RemotingConfiguration.Configure( @"NativeStructCellServer.exe.config"); Console.WriteLine("NativeStructCell Server started..."); Console.ReadLine(); } } }