いいえIntPtr
-anは整数(実際にはポインター)の単純なラッパーです-追加のメタデータはなく、それがどこから来たのかを数字だけで判断することは明らかに不可能です。
に関連付けられたメモリを解放する必要がある場合は、2つの別々のC ++ DLLのそれぞれに安全なハンドルを実装し、代わりに安全なハンドルを使用するようにPInvoke呼び出しを変更するIntPtr
ことをお勧めします。
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
。
詳細については、安全なハンドルに関するこのMSDNブログ記事を参照してください。