Доступ к доступному удаленно блоку.NET Используя нативный API.NET: ячейка и Struct

Почему использование API.NET с Массивами ячеек и структурами?

Используя представления.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:

  1. Измените ссылки для сгенерированного блока компонента к component_name\for_redistribution_files_only\component_nameNative.dll.

  2. Выберите соответствующую платформу сборки.

  3. Выберите режим Debug или Release.

  4. Разработайте проект NativeStructCellServer.

  5. Предоставьте конфигурационный файл для 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:

  1. Измените ссылки для сгенерированного блока компонента к component_name\for_redistribution_files_only\component_nameNative.dll.

  2. Измените ссылки для сгенерированного интерфейсного блока к component_name\for_redistribution_files_only\Icomponent_nameNative.dll.

  3. Выберите соответствующую платформу сборки.

  4. Выберите режим Debug или Release.

  5. Разработайте проект NativeStructCellClient.

  6. Предоставьте конфигурационный файл для 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)

Запуск серверного приложения

Запустите сервер путем выполнения следующего:

  1. Откройте DOS или командное окно UNIX® и cd к NativeStructCellServer\bin\x86\v4.0\Debug.

  2. Запустите 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]
    
    
    ##################################
    

Запуск клиентского приложения

Запустите клиент путем выполнения следующего:

  1. Откройте DOS или командное окно UNIX и cd к NativeStructCellClient\bin\x86\v4.0\Debug.

  2. Запустите 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();
        }
    }
}