我得到一个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#中调用它的正确方法是什么?
答案 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
数组与字节数组互换,这往往令人困惑。