Используя представления.NET массивов структур MATLAB® и массивов ячеек рекомендуется, если оба из них верны:
У вас есть функции MATLAB на сервере с struct MATLAB или типами данных ячейки как вводы или выводы
Вы не хотите или должны установить MATLAB Runtime на своих клиентских машинах
Нативный MWArray
, MWStructArray
и классы MWCellArray
являются членами пространства имен MathWorks.MATLAB.NET.Arrays.native
.
Имена классов в этом пространстве имен идентичны именам классов в MathWorks.MATLAB.NET.Arrays
. Различие - то, что нативные представления массивов структур и массивов ячеек не имеют никаких методов или свойств, которые требуют MATLAB Runtime.
Папка
имеет решения в качестве примера, можно практиковать создание. Папка matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET
NativeStructCellExample
содержит нативный struct и примеры ячейки.
Этот пример демонстрирует, как развернуть доступный удаленно использующий нативный struct компонента и массивы ячеек. Прежде чем вы установите доступный удаленно кодекс клиент-сервера, создадите доступный удаленно компонент.
Если вы еще не создали компонент, вы хотите развернуть, видеть инструкции в Создании Доступного удаленно Компонента Используя Приложение Library Compiler или Создание Доступного удаленно Компонента Используя Команду MCC.
Серверное приложение размещает удаленный компонент.
Клиентское приложение, запускающееся в отдельном процессе, получает доступ к удаленному компоненту, размещенному серверным приложением. Создайте сервер с файлом проекта Microsoft® Visual Studio® NativeStructCellServer.csproj
:
Измените ссылки для сгенерированного блока компонента к
.component_name\for_redistribution_files_only\component_nameNative.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(); } } }
Имя компонента, чтобы разместить
Протокол дистанционной работы и форматирование сообщения, чтобы использовать
Время владения для удаленного компонента
Кроме того, код также сигнализирует, что сервер активен и ожидает возврата каретки перед завершением.
Клиентское приложение, запускающееся в отдельном процессе, получает доступ к удаленному выполнению компонента в серверном приложении, созданном в Нативном Примере Ячейки и Struct.NET. Создайте удаленный клиент, использующий файл проекта Microsoft Visual Studio NativeStructCellClient\NativeStructCellClient.csproj
. Создать удаленный клиент, использующий Microsoft Visual Studio:
Измените ссылки для сгенерированного блока компонента к
.component_name\for_redistribution_files_only\component_nameNative.dll
Измените ссылки для сгенерированного интерфейсного блока к
.component_name\for_redistribution_files_only\Icomponent_nameNative.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(); } } }