exponenta event banner

Доступ к удаленной сборке .NET с помощью собственного API .NET: Cell and Struct

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

Использование представлений .NET структуры MATLAB ® и массивов ячеек рекомендуется в том случае, если оба эти представления соответствуют действительности:

  • На сервере имеются функции MATLAB со структурой MATLAB или типами данных ячейки в качестве входных или выходных данных.

  • Установка среды выполнения MATLAB на клиентских компьютерах не требуется и не требуется

Местный житель MWArray, MWStructArray, и MWCellArray классы являются членами MathWorks.MATLAB.NET.Arrays.native пространство имен.

Имена классов в этом пространстве имен идентичны именам классов в MathWorks.MATLAB.NET.Arrays. Отличие состоит в том, что собственные представления массивов структур и ячеек не имеют методов или свойств, требующих выполнения MATLAB.

matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET содержит примеры решений, которые можно практиковать при построении. NativeStructCellExample содержит собственные примеры структуры и ячеек.

Создание компонента

В этом примере показано, как развернуть удаляемый компонент с помощью собственной структуры и массивов ячеек. Прежде чем настраивать удаляемый код клиента и сервера, создайте удаляемый компонент.

Если компонент, который требуется развернуть, еще не создан, см. инструкции в разделе Создание удаляемого компонента с помощью приложения компилятора библиотеки или Создание удаляемого компонента с помощью команды mcc.

Пример собственной ячейки и структуры .NET

Серверное приложение размещает удаленный компонент.

Клиентское приложение, работающее в отдельном процессе, получает доступ к удаленному компоненту, размещенному серверным приложением. Создайте сервер с помощью файла проекта Microsoft ® Visual Studio ®NativeStructCellServer.csproj:

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

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

  3. Выберите режим «Отладка» или «Выпуск».

  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();
            }
         }
    }
    
    Этот код считывает связанный файл конфигурации для определения:

    • Имя компонента для размещения

    • Протокол удаленного взаимодействия и форматирование сообщений для использования

    • Время аренды удаленного компонента

    Кроме того, код также сигнализирует, что сервер активен и ожидает возврата каретки перед завершением.

Кодирование и построение клиентского приложения и конфигурационного файла

Клиентское приложение, работающее в отдельном процессе, получает доступ к удаленному компоненту, работающему в серверном приложении, построенном в примере Native .NET Cell and Struct. Построение удаленного клиента с помощью файла проекта 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. Выберите режим «Отладка» или «Выпуск».

  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 появляются следующие выходные данные:

    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
    
    #################################
    

Кодирование и построение клиентского приложения и файла конфигурации с использованием собственных классов MWArray, 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 в системном пути не требуется.

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();
        }
    }
}