开发者

Delphi DLL in C# - var array as parameter

i need use a Delphi DLL in my C# code.

I have some success when using other methods with com开发者_运维技巧mon parameters, but in this case the solution still hidden.

The DLL documentation presents this declaration:

Function Get_Matrix (var Matrix : array [ 1..200 ] of char) : boolean ; stdcall;

I tried to use:

[DllImport("DLL.dll")]
public static extern bool Get_Matrix(ref char[] Matrix);

Not successful. Some Help?


The first thing you need to do is to use stdcall on the C# side:

[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
    CharSet=CharSet.Auto)]

I'd also want to be sure that the Delphi side is post Delphi 2009 and so uses wide characters. If so, then there's no issue there. If you are using a non-Unicode Delphi then you'd need CharSet.Ansi.

I'd probably also return a LongBool on the Delphi side and marshal it with

[return: MarshalAs(UnmanagedType.Bool)]

back on the .NET side.

Finally, the fixed length array needs to be marshalled differently. The standard approach for fixed length character arrays is to use a StringBuilder on the .NET side which is marshalled as you desire.

Putting it altogether, and fixing your Delphi syntax, gives:

Delphi

type
  TFixedLengthArray = array [1..200] of char;

function Get_Matrix(var Matrix: TFixedLengthArray): LongBool; stdcall;

C#

[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
    CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool Get_Matrix(StringBuilder Matrix);

static void Main(string[] args)
{
    StringBuilder Matrix = new StringBuilder(200);
    Get_Matrix(Matrix);
}

Finally, make sure that you null-terminate your string when you return it from your DLL!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜