从应用程序域中删除程序集

时间:2013-05-28 18:47:05

标签: c# multithreading .net-assembly appdomain

所以我正试图从我的手中删除一个程序集 Thread.GetDomain().GetAssemblies() 区域。

到目前为止,我已经在网上看了几个解释,但是还是没能弄明白。

这是我到目前为止所得到的

AppDomain tempD = Thread.GetDomain();
tempD.DoCallBack(LoaderCallback);
AppDomain.Unload(tempD);
System.IO.File.Delete(assemblyName);

private static void LoaderCallback()
{
     Assembly.ReflectionOnlyLoad("myAssembly");

     //byte[] raw = System.IO.File.ReadAllBytes(test);
     //Assembly yacsi = Assembly.Load(raw);
     //((IScript)yacsi.CreateInstance("Script")).Go();
}

到目前为止,我已经玩过这个概念,但我很难建立连接,因为Thread.GetDomain();不包含Unload命令

此外,我无法尝试此部分((IScript)yacsi.CreateInstance("Script")).Go(),因为我不知道程序集IScript是什么,也不知道在“脚本”文本部分中放置什么

任何想法都将受到赞赏

1 个答案:

答案 0 :(得分:2)

要添加@ RobertHarvey的评论并退后一步,您要做的是创建一个单独的AppDomain并将您的程序集加载到其中。 之后,您可以将您打算使用的各种类型编组到您的域中。

完成它们后,您可以卸载应用程序域,从而摆脱程序集。

您应该注意,域间实例封送是通过.NET Remoting完成的,因此您可能希望使用remoting lease policies,其中包括封送对象生命周期的时间值。修改租约期限的原因是编组实例在预定义的一段时间后到期,如果它根本没有调用/使用的话。因此,您可能希望避免一遍又一遍地重新编组实例,并且只是延长其域中的生命周期。

我认为this is a good sample展示了如何将程序集加载到新的AppDomain中并卸载它。那里有很多其他样品。

只要你知道这个过程应该是什么,找到它的代码是很简单的。