いいえ - IntPtr
は、整数(実際にはポインタ)を囲む単なるラッパーです。追加のメタデータはなく、出現した番号から分かりにくいことは明らかに不可能です。
あなたはIntPtr
に関連付けられたメモリを解放する必要があるなら、私はあなた、あなたの二つの別々のC++のDLLのそれぞれについてimplement a safe handleとあなたのPInvokeは、例えば、代わりに安全なハンドルを使用して呼び出して変更することをお勧めします。
internal class FirstDllSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private MySafeFileHandle()
: base(true)
{
}
override protected bool ReleaseHandle()
{
return NativeMethods.FirstDll_OBJECT_FREE(handle);
}
}
internal class NativeMethods
{
[DllImport("whatever.dll")]
public static extern void FirstDll_OBJECT_FREE(FirstDllSafeHandle handle);
[DllImport("whatever.dll")]
public static extern void FirstDll_GetObject(out FirstDllSafeHandle handle);
[DllImport("whatever.dll")]
public static extern void SecondDll_OBJECT_FREE(SecondDllSafeHandle handle);
[DllImport("whatever.dll")]
public static extern void SecondDll_GetObject(out SecondDllSafeHandle handle);
}
を使用IntPtr
の代わりに安全なハンドルを使用すると、IntPtr
に関連するリソースを解放する適切な方法をシームレスに把握することができます。
詳しくは、安全なハンドルのthis MSDN blog articleを参照してください。
問題は、2つのアンマネージライブラリに2つの 'OBJECT_FREE'メソッドがあることです。そこで、それぞれが正しいフリーメソッドを呼び出す2つの 'MySafeHandle'実装が必要になります。 –
@DarinDimitrovはい、これがアイデアです。私はこれをもっと明確にしようと少し答えを書き直しました。 – Justin
SafeHandleのアプローチは間違いなく私の中期的な解決策です。しかし、これが何百もの呼び出しに影響するという事実のために、私は速い勝利を望んでいました。明らかに、IntPtr自体はどこから来たのか分からず、短期間のハックとして使うことができるWindows API呼び出しかもしれないと思っていました。 – Modan