从 C# 到 C++ 的调用无法正确传递参数

Call from C# to C++ fails to pass parameters correctly

我有一个从 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 类型上。

in 修饰符使参数成为只读 ref 参数。它与 [In] 属性不同,后者是编组提示。

您正在传递 0bufferSize,C# 正在获取它们的地址(通过临时变量的文字 0)并传递它们。

您得到的值各不相同,因为每次的地址都不同。

删除 in 修饰符,以便 C# 传递这些值而不是地址。