像这样在 C# 中声明函数:
[DllImport(@"MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int func1(
int arg1,
StringBuilder arg2,
out int arg3
);
然后这样称呼它:
int arg1 = ...;
StringBuilder sb = new StringBuilder(2048);
int arg3;
int retVal = func1(arg1, sb, out arg3);
string arg2 = sb.ToString();
请注意,C#IntPtr
与 C 不匹配int
。您需要 C#int
来匹配它,因为IntPtr
它与指针大小相同,无论是 32 位还是 64 位。但int
始终是 4 个字节。
我假设您的 DLL 使用 cdecl 调用约定。如果您使用 stdcall,则可以进行明显的更改。
我还假设您的数据实际上是文本数据。如果它只是一个普通的旧字节数组,那么代码就更简单了。
[DllImport(@"MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int func1(
int arg1,
byte[] arg2,
out int arg3
);
然后调用:
int arg1 = ...;
byte[] arg2 = new byte[2048];
int arg3;
int retVal = func1(arg1, arg2, out arg3);