Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Передача двумерного массива структур между C# и Delphi: использование Unmanaged Exports

Delphi , Синтаксис , Массивы

Вопрос, с которым сталкивается разработчик при работе с C# и Delphi, заключается в передаче двумерного массива структур между этими языками программирования. Это может быть связано с использованием библиотеки RGiesecke's "Unmanaged Exports" для создания DLL, которая может быть вызвана из приложения на Delphi. В данной статье мы рассмотрим, как можно решить эту задачу, используя примеры кода на Object Pascal (Delphi) и C#.

Описание проблемы

Разработчик использует библиотеку "Unmanaged Exports" для создания DLL на C#, которая будет использоваться в приложении на Delphi. Необходимо передать из Delphi в C# двумерный массив структур. В C# уже реализована функция, принимающая одномерный массив структур, но требуется расширение для работы с двумерными массивами.

Пример кода в C

В C# уже есть функция:

public struct MyVector
{
  public float X;
  public float Y;
}

[DllExport]
public static void DoStuff([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]
  MyVector[] vectors, int count)
{
  // Do stuff
}

Используя данный код, можно вызвать функцию из Delphi, передавая одномерный массив структур.

Пример кода в Delphi

В Delphi уже реализована функция, которая может вызвать C# функцию:

unit MyUnit
interface
type
  TVector = array[X..Y] of Single;
  TVectorCollection = array of TVector;
  procedure TDoExternalStuff(const vectors: TVectorCollection; count: Integer; stdcall;
  procedure DoSomeWork;
implementation
procedure DoSomeWork;
var
  vectors: array of TVector;
  fDoExternalStuff: TDoExternalStuff;
  Handle: THandle;
begin
  // omitted: create and fill vectors
  Handle := LoadLibrary('MyExport.dll');
  @fDoExternalStuff := GetProcAddress(Handle, 'DoStuff');
  fDoExternalStuff(vectors, Length(vectors));
end;
end.

Проблема с двумерным массивом

Разработчику необходимо передать двумерный массив, то есть массив массивов структур. Попытка просто изменить тип параметра в C# на MyVector[][] не приводит к успеху при вызове из Delphi, так как в C# нет автоматического распознавания двумерных массивов в данном контексте.

Решение проблемы

В C# необходимо передать массив указателей на начала подмассивов и массив длин этих подмассивов. Это позволит правильно обработать двумерный массив на стороне C#. Пример такой функции:

[DllExport]
public static void DoStuff(
    [In] int arrayCount,
    [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] arrays,
    [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] subArrayCount
)
{
    // ...
}

На стороне Delphi, зная особенность динамического массива динамических массивов, который фактически является указателем на массив указателей на подмассивы, можно использовать следующий код:

type
  TVectorDoubleArray = array of array of TVector;
  TIntegerArray = array of Integer;
procedure DoStuff(
  arrays: TVectorDoubleArray;
  arrayCount: Integer;
  subArrayCount: TIntegerArray
); stdcall; external dllname;
...
procedure CallDoStuff(const arrays: TVectorDoubleArray);
var
  i: Integer;
  subArrayCount: TIntegerArray;
begin
  SetLength(subArrayCount, Length(arrays));
  for i := 0 to High(subArrayCount) do
    subArrayCount[i] := Length(arrays[i]);
  DoStuff(arrayCount, arrays, subArrayCount);
end;

Заключение

Передача двумерного массива структур между C# и Delphi требует особого подхода. Необходимо использовать массив указателей на начала подмассивов и массив длин этих подмассивов. Это позволит корректно обработать данные на стороне C# и правильно передать их из Delphi.

Создано по материалам из источника по ссылке.

Разработчик столкнулся с задачей передачи двумерного массива структур между приложениями на C# и Delphi, используя библиотеку 'Unmanaged Exports', и ищет решение для корректной обработки данных на стороне C#.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Массивы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:37:57/0.0015149116516113/0