将 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":无法封送泛型类型。

如何成功地将空参数传递给此方法?

将 null 传递给互操作方法时,它会引发“泛型类型无法封送”

我猜你误认为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++声明。