C# 如何将可为null的类型传递给P/调用的函数

C# 如何将可为null的类型传递给P/调用的函数,c#,.net,interop,pinvoke,optional-parameters,C#,.net,Interop,Pinvoke,Optional Parameters,我有几个p/调用函数(但我现在正在重写代码,所以我正在整理),我想知道如何使用/传递一个可为null的类型作为参数之一。使用int类型不是问题,但考虑到以下情况: [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, int? enumerator, IntPtr hwndPa

我有几个p/调用函数(但我现在正在重写代码,所以我正在整理),我想知道如何使用/传递一个可为null的类型作为参数之一。使用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

如果没有一些。。。本机代码中有趣的字节操作几乎肯定不是您想要的

如果您需要能够将结构值作为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);
}

到目前为止,我一直在重载我的P/invoke函数。我的问题是看我是否可以通过不需要过载的方式简化这个过程,并进一步整理我的代码。到目前为止,我已经能够将int(参数2)作为一个可为null的值进行传递,没有任何问题。这是否意味着此限制仅适用于结构化类型?在我的代码的一个化身中,我将参数2定义为
[Marshallas(UnmanagedType.LPTStr)]字符串枚举器
,这也允许我在使用期间将此参数置为空。我很抱歉。。。我不能用一个可以为null的int:)@River-Mine不是一个令人不快的问题,因为这个问题早在2009年就被问到了;)新的一个是尝试创建这个问题的规范版本,提供更多更通用的解决方案。