【发布时间】:2020-12-14 20:06:55
【问题描述】:
我有一个从 C# 到 C++ 的非常基本的调用。函数调用需要三个参数:
extern "C" int CLIENT_API example(const char, char * const, const unsigned int);
C# 代码将该函数导入为:
[DllImport("my.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int example(in sbyte id, byte[] buffer, in uint bufferSize);
当我像这样从 C# 调用函数时:
uint bufferSize = 400;
byte[] buffer = new byte[bufferSize];
example(0, buffer, bufferSize);
我记录了 id 和 bufferSize 的 C++ 大小变量值(对于这两个变量,每次运行都有不同的值)。我究竟做错了什么?我有其他互操作函数将指针和字符串传递给我的 C++ DLL,它们没有任何问题。似乎它只发生在更原始的 byte 和 uint 类型中。
【问题讨论】:
-
不要不要在 pinvoke 声明中使用
in,这是纯粹的 C# hackorama 来伪装指针。来自 Roslyn 团队的可怕 hack,与从 C++ 到 C# 的编译性能作斗争。您看到的值看起来是随机的,因为传递的实际值(指针)是不可预测的。只需删除in。