可能重复:
Unloading the Assembly loaded with Assembly.LoadFrom()
我使用自定义AppDomain
来加载/卸载程序集。但是当卸载装配时,我能够在AppDomain.CurrentDomain
下看到它。
它怎么样?这是正常行为还是我遗失了什么?
谢谢你的任何线索!
string assemblyPath = @"C:\MyFile.dll";
var assemblyName = AssemblyName.GetAssemblyName(assemblyPath);
var ads = new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
DisallowCodeDownload = true
};
AppDomain newDomainName = AppDomain.CreateDomain("newDomainName", null, ads);
try
{
Assembly testLibrary = newDomainName.Load(assemblyName);
var c1 = AppDomain.CurrentDomain.GetAssemblies();
var c2 = newDomainName.GetAssemblies();
}
finally
{
AppDomain.Unload(newDomainName);
var c3 = AppDomain.CurrentDomain.GetAssemblies();
// The assembly is still visible here!!!
}
答案 0 :(得分:4)
您正在调用AppDomain的Load()
方法,该方法根据documentation:“仅用于将程序集加载到当前应用程序域中。此方法是为了方便无法调用静态Assembly.Load方法的互操作性调用者。要将程序集加载到其他应用程序域,请使用CreateInstanceAndUnwrap等方法。“
换句话说,您正在将程序集加载到主AppDomain中,因为您正在从主AppDomain调用Load()
(即使您在实例上使用它调用它)您的辅助AppDomain),这就是为什么它甚至在您卸载辅助AppDomain后出现。
如上文文档摘录所示,您可能希望使用AppDomain.CreateInstanceAndUnwrap。
答案 1 :(得分:2)
您无法从应用程序域中删除已加载的程序集。
http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx
http://msdn.microsoft.com/en-us/library/ms173101(v=vs.80).aspx
如果不卸载所有组件,则无法卸载单个组件 包含它的应用程序域。即使大会去了 超出范围,实际的程序集文件将保持加载直到所有 包含它的应用程序域已卸载。
http://blogs.msdn.com/b/suzcook/archive/2003/07/08/unloading-an-assembly.aspx
如果不卸载所有组件,就无法卸载单个组件 包含它的appdomains。