如何在某些情况下需要空指针的P/Invoke签名中使用SafeHandle?

dav*_*ngo 8 c# pinvoke dllimport cer

希望这对于SO来说并不是太模糊,但请考虑以下P/Invoke签名:

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    IntPtr InputHandle,
    ref IntPtr OutputHandlePtr);
Run Code Online (Sandbox Code Playgroud)

我想重新设计此签名以使用SafeHandles,如下所示:

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    MySafeHandle InputHandle,
    ref MySafeHandle OutputHandlePtr);
Run Code Online (Sandbox Code Playgroud)

但是,根据MSDN,当HandleType参数为SQL_HANDLE_ENV时,InputHandle参数必须为空指针,否则为非空指针.

如何在单个P/Invoke签名中捕获这些语义?请在答案中包含示例呼叫站点.我目前的解决方案是使用两个签名.

shf*_*301 3

SafeHandle是一门课程,因此您应该能够通过null而不是实际的SafeHandle. 空引用在 P/Invoke 中被封送为空指针。

SafeHandle handle = new SafeHandle();
OdbcResult result= SQLAllocHandle(OdbcHandleType.SQL_HANDLE_ENV, null, ref handle);
Run Code Online (Sandbox Code Playgroud)

  • 在这里不起作用,我从 `System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)` 得到一个 `ArgumentNullException`。 (5认同)
  • 还可以声明“out SafeHandle”参数。 (2认同)