将 null 传递给 Interop 方法时,它会抛出“无法封送通用类型”。例外

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”:无法编组通用类型。

我如何成功地将空参数传递给这个方法?

Pet*_*iho 5

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