从 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]
属性不同,后者是编组提示。
您正在传递 0
和 bufferSize
,C# 正在获取它们的地址(通过临时变量的文字 0
)并传递它们。
您得到的值各不相同,因为每次的地址都不同。
删除 in
修饰符,以便 C# 传递这些值而不是地址。
我有一个从 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]
属性不同,后者是编组提示。
您正在传递 0
和 bufferSize
,C# 正在获取它们的地址(通过临时变量的文字 0
)并传递它们。
您得到的值各不相同,因为每次的地址都不同。
删除 in
修饰符,以便 C# 传递这些值而不是地址。