Правильно.Переменная GCHandle не влияет на время жизни объекта, который вы передаете в GCHandle.Alloc ().Я проверил это с помощью следующих двух классов:
class Test
{
public Test ()
{
System.Runtime.InteropServices.GCHandle.Alloc(this);
}
~Test ()
{
}
}
class Server : MarshalByRefObject
{
public Server ()
{
new Test();
}
public void Collect ()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
и следующего кода теста:
AppDomain ad = AppDomain.CreateDomain("test");
Server svr = (Server)ad.CreateInstanceAndUnwrap(
System.Reflection.Assembly.GetExecutingAssembly().FullName,
typeof(Server).FullName);
for (Int32 i = 0; i < 100; i++)
svr.Collect();
Используя этот пример, если вы установите точку останова в финализаторе класса Test, выобратите внимание, что он не вызывается во время каких-либо вызовов GC.Collect / WaitForPendingFinalizers.Тем не менее, точка останова достигается, когда домен приложения выгружается.