Cómo pasar un tipo anulable a una función P / invocada

Tengo algunas funciones p / invocadas (pero estoy reescribiendo mi código en este momento, así que estoy ordenando) y quiero saber cómo usar / pasar un tipo que admite nulos como uno de los parámetros. trabajar con tipos int no es un problema, pero se da lo siguiente:

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

Me gustaría poder pasar el parámetro Guid como un tipo anulable. Tal como está en este momento, puedo llamarlo así:

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

pero necesito que el primer parámetro también sea aceptable como null .

No es posible pasar un tipo Nullable a una función PInvoke’d sin alguna … interesante manipulación de bytes en código nativo que casi con seguridad no es lo que quieres.

Si necesita la capacidad de pasar un valor struct como NULL al código nativo declarar una sobrecarga de su statement PInvoke que toma un IntPtr en el lugar de la estructura y pasar 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); 

Nota: agregué una clase de referencia a la primera firma. Si la firma nativa puede tomar NULL, es probable que sea un tipo de puntero. Por lo tanto, debe pasar tipos de valor por referencia.

Ahora puedes hacer llamadas como las siguientes

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