0

可能重复:
卸载使用 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!!!
              }
4

2 回答 2

4

您正在调用Load()AppDomain 的方法,根据文档:“应仅用于将程序集加载到当前应用程序域中。提供此方法是为了方便无法调用静态 Assembly.Load 方法的互操作性调用者。要将程序集加载到其他应用程序域,请使用 CreateInstanceAndUnwrap 等方法。”

换句话说,您正在将程序集加载到主 AppDomain 中,因为您是Load() 主 AppDomain 调用的(即使您正在使用在辅助 AppDomain 的实例上调用它),这就是它甚至在之后出现的原因您卸载辅助 AppDomain。

如上述文档的摘录所示,您可能想要使用AppDomain.CreateInstanceAndUnwrap

于 2012-09-17T13:30:12.330 回答
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

如果不卸载包含它的所有应用程序域,就无法卸载单个程序集。

于 2012-09-17T13:25:51.717 回答