我正在使用这样导入的C ++ dll:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte deviceAddress);
我可以使用不为null的参数成功访问此方法,如下所示:
GetDevice(0, 3);
但是用这样的空参数调用此方法:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, Nullable<byte> deviceAddress);
GetDevice(0, null);
给出以下运行时错误:
发生类型为'System.Runtime.InteropServices.MarshalDirectiveException'的未处理异常。
附加信息:无法封送'parameter#2':通用类型不能封送。
如何成功将null参数传递给此方法?
最佳答案
我猜您可能误认为Nullable<byte>
等同于C ++的unsigned char *
或类似版本。不是。它实际上是单个byte
,但其中的值也可以是null
。
如错误消息所述,您也不允许传递通用类型,当然Nullable<T>
是通用类型。因此,即使它在语义上意味着您想要的,也不会被允许。
但是根据您的问题“如何成功将空参数传递给此方法?”,这表明您真正要处理的是指针类型作为参数类型。没有complete code example,就不可能确定您的声明和用法是什么。但是您很可能只需将参数声明为byte[]
,p / invoke便会正确封送它,包括将托管的null引用映射到null指针。
即只需这样声明您的方法:
[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte[] deviceAddress);
默认的封送处理将为您工作。如果没有,那么您将需要编辑您的问题以包括您要调用的确切C ++声明。