gpt4 book ai didi

c# - 将 null 传递给 Interop 方法时,它会抛出 "Generic types cannot be marshaled."异常

转载 作者:行者123 更新时间:2023-11-30 22:01:54 24 4
gpt4 key购买 nike

我正在使用像这样导入的 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>是泛型。因此,即使它在语义上意味着您想要的,也不会被允许。

但是根据您的问题“我如何成功地将空参数传递给此方法?”,这表明您真正处理的是指针类型作为参数类型。没有 complete code example不可能确定您的声明和用法应该是什么。但很可能您可以将参数声明为 byte[] ,并且 p/invoke 将正确编码它,包括将托管空引用映射到空指针。

即只需像这样声明您的方法:

[DllImport("Bank.dll"]
static extern int GetDevice(byte versionCode, byte[] deviceAddress);

默认编码应该适合您。如果不是,那么您需要编辑您的问题以包含您尝试调用的确切 C++ 声明。

关于c# - 将 null 传递给 Interop 方法时,它会抛出 "Generic types cannot be marshaled."异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com