Bos*_*ude 5 c# generics interop
我正在使用这样导入的 C++ dll:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte deviceAddress);
Run Code Online (Sandbox Code Playgroud)
我可以使用非空参数成功访问此方法,如下所示:
GetDevice(0, 3);
Run Code Online (Sandbox Code Playgroud)
但是使用空参数调用此方法,如下所示:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, Nullable<byte> deviceAddress);
GetDevice(0, null);
Run Code Online (Sandbox Code Playgroud)
给出以下运行时错误:
发生类型为“System.Runtime.InteropServices.MarshalDirectiveException”的未处理异常。附加信息:无法编组“参数#2”:无法编组通用类型。
我如何成功地将空参数传递给这个方法?
我猜你误认为Nullable<byte>相当于 C++unsigned char *或类似的。它不是。它字面上是单一的 byte,但其中的值也可以null。
正如错误消息所示,您也不允许传递泛型类型,当然Nullable<T>是泛型类型。因此,即使它在语义上意味着你想要的,它也不会被允许。
但根据你的问题,“我如何成功地将空参数传递给这个方法?”,这表明你真正处理的是指针类型作为参数类型。如果没有完整的代码示例,就不可能确定您的声明和用法应该是什么。但您可能只需将参数声明为 a byte[],然后 p/invoke 将正确封送它,包括将托管空引用映射到空指针。
即只需像这样声明你的方法:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte[] deviceAddress);
Run Code Online (Sandbox Code Playgroud)
默认的封送处理应该适合您。如果没有,那么您需要编辑您的问题以包含您尝试调用的确切 C++ 声明。