问题 如何将可空类型传递给P /被调用函数[重复]


这个问题在这里已有答案:


2158
2018-06-26 15:06


起源

@River Mine不是一个令人讨厌的问题,因为这是在2009年被问到的;) - Dark Star1
新的是试图创建这个问题的规范版本,更多的解决方案更通用。 - River


答案:


如果没有一些......本机代码中有趣的字节操作几乎肯定不是你想要的,那么将Nullable类型传递给PInvoke'd函数是不可能的。

如果您需要能够将结构值作为NULL传递给本机代码,则声明PInvoke声明的重载,该声明将IntPtr替换为结构并传递IntPtr.Zero

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, ref int enumerator, IntPtr hwndParent, uint Flags);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr enumerator, IntPtr hwndParent, uint Flags);

注意:我在第一个签名中添加了一个ref类。如果本机签名可以为NULL,则可能是指针类型。因此,您必须通过引用传递值类型。

现在您可以拨打以下电话

if (enumerator.HasValue) { 
  SetupDiGetClassDevs(someGuid, ref enumerator.Value, hwnd, flags);
} else {
  SetupDiGetClassDevs(someGuid, IntPtr.Zero, hwnd, flags);
}

11
2018-06-26 15:11



到目前为止,我一直在重载我的P / invoke函数。我的问题是看看我是否可以通过不需要重载来快速更新并整理我的代码。到目前为止,我已经能够将int(参数2)作为可空值传递而没有问题这是否意味着这种重新解析只适用于结构化类型?在我的代码的一个化身中的另一件事我将参数2定义为 [MarshalAs(UnmanagedType.LPTStr)] string Enumerator 这也允许我在使用过程中使这个参数无效。 - Dark Star1
我道歉......我无法逃脱可空的int :) - Dark Star1