我正在使用这样导入的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 ++声明。

08-18 09:42
查看更多