Нет - IntPtr
- это просто обертка вокруг целого числа (на самом деле указатель) - нет никаких дополнительных метаданных, и, очевидно, невозможно определить только по числу, откуда они пришли.
Есливам нужно освободить память, связанную с IntPtr
, тогда я рекомендую вам реализовать безопасный дескриптор для каждой из ваших двух отдельных библиотек C ++ DLL и изменить вместо них вызовы 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
.
См. эта статья блога MSDN о безопасных ручках, чтобы узнать больше.