【问题标题】:AppDomain exception is thrown引发 AppDomain 异常
【发布时间】:2012-12-08 19:48:40
【问题描述】:

我发现了很多类似的问题,但找不到任何解决方案。

我有以下代码:

    string file = "c:\\abc.dll";
    AppDomainSetup ads = new AppDomainSetup();
    ads.PrivateBinPath = Path.GetDirectoryName(file);
    AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads);
    ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName); 

Assembly asm = proxy.GetAssembly(file); // exception File.IO assembly not found is thrown here after succesfully running the funktion GetAssembly.


  public class ProxyDomain : MarshalByRefObject
  {
     public Assembly GetAssembly(string assemblyPath)
     {
        try
        {
           Assembly asm = Assembly.LoadFile(assemblyPath);
           //...asm is initialized correctly, I can see everything with debugger
           return asm;
        }
        catch
        {
           return null;
        }
     }
  }

最有趣的是,我的 GetAssembly 函数返回了一些其他类型,甚至是我的自定义可序列化类,一切都很好。有人知道我错过了什么吗?还是无法将加载的程序集返回到另一个域?

谢谢

【问题讨论】:

  • 您为什么要尝试将Assembly 返回到父应用程序域?通常,可以避免这种情况,因此父应用程序域不必加载程序集,并且可以在子应用程序域卸载时将其卸载。
  • 如果您解释了您试图通过此 ProxyDomain 类实现的目标,将会有所帮助。如果要将完整程序集返回到主域,为什么需要新的 AppDomain?
  • 好吧,我的第一个 appdomain 中并不需要这个程序集。我在一个文件夹中有很多它们,我必须找到包含特殊类属性的程序集并返回一个 dll 名称列表。我需要第二个应用程序域,因为在应用程序重新启动之前无法删除在主应用程序域中加载的所有程序集。我解决了我的问题,但仍然知道为什么它会返回所有其他类型并且无法返回 Assembly。

标签: c# appdomain .net-assembly


【解决方案1】:

我想File.IO 位于您的主应用程序的 bin 目录中?如果是这样,您的 abc.dll 将不知道在哪里找到它(除非您的主应用程序也在 C:\\ 中)。

你需要做一个

  1. BindAppDomain.AssemblyResolve 事件并手动加载引用的dll
  2. 更改AppDomainSetup 的基目录(这是.NET 知道查找dll 的地方之一)
  3. File.IO 安装到GAC(这是.NET 知道查找dll 的另一个地方)
  4. File.IO 的位置添加到您的AppDomainSetup 的私有探测路径(这是.NET 将尝试查找dll 的另一个位置)。

【讨论】:

  • File.IO 是一个异常类型。 abc.dll 不在同一个目录中,执行程序。正如我所说,所有其他返回类型都有效,只是 Assembly 没有
  • 事件没有捕捉到任何事件并且 basedircetory 没有改变事情
  • @VladL,.Net 中没有“File.IO”异常类型 - 所有异常类型的名称中都有“Exception”。您确定您正确复制粘贴了异常类型/文本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2016-08-31
  • 2013-08-02
  • 2012-10-10
相关资源
最近更新 更多