特定の場合にヌルポインターを必要とするP/Invoke SignatureでSafeHandleをどのように使用できますか?
質問
うまくいけば、これはあまりにもあいまいではありませんが、次のp/invoke signatureを考慮してください。
[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
OdbcHandleType HandleType,
IntPtr InputHandle,
ref IntPtr OutputHandlePtr);
次のように、SafeHandlesを使用するためにこの署名を再設計したいと思います。
[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
OdbcHandleType HandleType,
MySafeHandle InputHandle,
ref MySafeHandle OutputHandlePtr);
でも、 MSDNによると, 、Handletype引数がsql_handle_envであり、それ以外の場合は非ヌルポインターである場合、不利益の引数はヌルポインターでなければなりません。
これらのセマンティクスを単一のP/Invoke Signatureでキャプチャするにはどうすればよいですか?回答にコールサイトの例を含めてください。私の現在の解決策は、2つの署名を使用することです。
解決
SafeHandle
クラスなので、合格できるはずです null
実際のものではなく SafeHandle
. 。 null参照は、p/invokeのヌルポインターとしてマーシャリングされます。
SafeHandle handle = new SafeHandle();
OdbcResult result= SQLAllocHandle(OdbcHandleType.SQL_HANDLE_ENV, null, ref handle);
他のヒント
SHF301による答え パス null
入力引数の場合 InputHandle
. 。これはほとんどのAPIでは機能しません(おそらく、回答を受け入れたことを考えると、OPの特定の問題に対して何らかの形で行われます)。
私はこのパターンを使用します:
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public class RegionHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private RegionHandle() : base(true) {}
public static readonly RegionHandle Null = new RegionHandle();
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
override protected bool ReleaseHandle()
{
return Region.DeleteObject(handle);
}
}
これは、ヌルハンドルを渡すためにこれを行うことができることを意味します。
SomeApi(RegionHandle.Null);
それはどのようにあるかに似ています IntPtr.Zero
静的メンバー。
所属していません StackOverflow