Используя представления.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.
Нативный пример ячейки и Struct.NET
Серверное приложение размещает удаленный компонент.
Клиентское приложение, запускающееся в отдельном процессе, получает доступ к удаленному компоненту, размещенному серверным приложением. Создайте сервер с файлом проекта 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
.
Код 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\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
#################################
Кодируя и создание клиентского приложения и конфигурационного файла с собственным компонентом Мварреем, MWStructArray и классами MWCellArray
createEmptyStruct.m
Инициализируйте структуру на сервере и отправьте его клиенту со следующим кодом 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');
updateField.m
Получите частично обновленную структуру от клиента и добавьте больше данных в него, прежде, чем пасовать назад его клиенту, со следующим кодом 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');
NativeStructCellClient.cs
Создайте клиент код 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();
}
}
}
NativeStructCellServer.cs
Создайте сервер код 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();
}
}
}