如何将可空类型传递给P /被调用函数

我有几个p /被调用的函数(但我现在正在重写我的代码所以我正在整理)我想知道如何使用/传递一个可空类型作为参数之一。 使用int类型不是问题,但给出以下内容:

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

我希望能够将Guid参数作为可空类型传递。 目前我可以将其称为:

 SetupDiGetClassDevs(ref tGuid, null, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT ); 

但我需要第一个参数也可以作为null传递。

如果没有一些……本机代码中有趣的字节操作几乎肯定不是你想要的,那么将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); }