Delphi Dll 到 C#

use*_*394 1 c# delphi pinvoke

尝试了很多例子但没有成功我有一个用Delphi编写的DLL,它导出一个返回数组的函数,然后导入到C#应用程序中。A 成功处理一个变量:

德尔福

function GetArrayData(var testArray : integer): WordBool; stdcall; export;
begin
  testArray := 1;
  Result := True;
end;
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport("some.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    static extern bool GetArrayData([Out] out IntPtr IntegerArrayReceiver);

private void GetButton_Click(object sender, EventArgs e)
{
    unsafe
    {
        IntPtr  IntegerArrayReceiver = IntPtr.Zero;
        GetArrayData(out IntegerArrayReceiver);
        textBoxData.Text = IntegerArrayReceiver.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

请有人将这段代码转换为与数组一起使用。意思是从 Delphi 导出一个数组并导入到 C# 数组。我有 Delphi 和 C# 代码的源代码。

Dav*_*nan 5

在Delphi方面你可以这样写:

function GetArrayData(arr: PInteger; len: Integer): LongBool; stdcall;
var
  i: Integer;
  P: PInteger;
begin
  P := arr;
  for i := 0 to len-1 do
  begin
    P^ := i;
    inc(P);
  end;
  Result := True;
end;
Run Code Online (Sandbox Code Playgroud)

这里我们收到一个指向第一个元素的指针以及数组的长度。

在 C# 方面,您可以编写:

[DllImport("some.dll")]
static extern bool GetArrayData(int[] arr, int len);
....
int[] arr = new int[42];
if (GetArrayData(arr, arr.Length))
    ....
Run Code Online (Sandbox Code Playgroud)

调用 C# 代码分配数组并将指向第一个元素的指针传递给 Delphi 代码。