将 null 传递给互操作方法时,它会引发“泛型类型无法封送”
本文关键字:泛型类型 null 操作方法 | 更新日期: 2023-09-27 18:33:34
我正在使用像这样导入的C++ dll:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte deviceAddress);
我可以使用非空参数成功访问此方法,如下所示:
GetDevice(0, 3);
但是使用空参数调用此方法,如下所示:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, Nullable<byte> deviceAddress);
GetDevice(0, null);
给出以下运行时错误:
发生了类型为"System.Runtime.InteropServices.MarshalDirectiveException"的未处理异常。其他信息:无法封送"参数 #2":无法封送泛型类型。
如何成功地将空参数传递给此方法?
我猜你误认为Nullable<byte>
等同于C++的unsigned char *
或类似的东西。不是。它实际上是单个byte
,但值也可以null
。
正如错误消息所说,您也不允许传递泛型类型,当然Nullable<T>
泛型类型。因此,即使它在语义上意味着你想要的,它也不会被允许。
但是根据您的问题"如何成功地将 null 参数传递给此方法?",这表明您真正处理的是作为参数类型的指针类型。如果没有完整的代码示例,就不可能确定您的声明和用法应该是什么。但是您可能只将参数声明为byte[]
,p/invoke 将正确封送它,包括将托管空引用映射到空指针。
即只需像这样声明您的方法:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte[] deviceAddress);
默认封送处理应该适合您。如果没有,则需要编辑问题以包含您尝试调用的确切C++声明。