为什么装配仍然可见?

时间:2012-09-17 13:22:09

标签: c# .net

  

可能重复:
  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!!!
              }

2 个答案:

答案 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。