【问题标题】:Why assembly is still visible? [duplicate]为什么组装仍然可见? [复制]
【发布时间】:2012-09-09 17:18:06
【问题描述】:

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

【问题讨论】:

  • @asawyer 不,这不是重复的问题,我使用新的 AppDomain 来保持加载的程序集。

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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。

    【讨论】:

    • 但我正在卸载它 AppDomain.Unload(newDomainName);请告诉我我哪里错了?
    • @Peretz Iridium 是正确的。您正在错误地加载程序集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多