如何从C#中的DLL调用这个Delphi函数?

时间:2017-07-10 19:35:57

标签: c# function delphi dll char

我得到一个Delphi DLL,其中包含我需要在C#中调用的函数。其中一个函数需要两个char数组,其中一个是加密密码,另一个是密钥。

TCString = array[0..254] of Char;
...
function Decrypt(const S, Key: TCString): TCString; stdcall;

我试图弄清楚如何自己调用这个函数,但我一直得到"无法编组'返回值':无效的托管/非托管类型组合。"我使用字节,因为Delphi中的Char类型是8位的AnsiChar。

[DllImport("path", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern byte[] Decrypt(byte[] S, byte[] Key);

在C#中调用它的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

我想我倾向于将固定长度数组包装在C#struct中。

public struct CString
{
    [UnmanagedType.ByValArray(SizeConst=255)]
    byte[] value;
}

这允许仅在一个地方指定大小。

下一个障碍是返回值。 Delphi ABI将无法放入寄存器的返回值视为附加的隐藏var参数。我将其翻译为C#out参数。

最后,两个输入参数声明为const。这意味着它们通过引用传递。

所以函数将是:

[DllImport(dllname, CallingConvention = CallingConvention.StdCall)]
public static extern void Decrypt(
    [In] ref CString S, 
    [In] ref CString Key, 
    out CString Result

);

我故意避免在此使用任何文本,因为这似乎是对二进制数据进行操作的函数。在这种情况下,许多Delphi程序员会将AnsiChar数组与字节数组互换,这往往令人困惑。