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