代码之家  ›  专栏  ›  技术社区  › 

将.dll/.exe从文件加载到临时AppDomain会引发异常

  •  2
  •  · 技术社区  · 16 年前

    问题:由于我用反射加载的.dll/.exe在应用程序domian卸载之前不会卸载,因此它现在被锁定,并且无法再次生成项目,因为VS尝试重新创建文件(所有标准的东西)。我已经尝试创建临时文件,然后反思他们…没有工作,仍然锁定原始文件(我完全不明白,顺便说一句)。现在我正在创建一个临时AppDomain来加载文件,然后销毁。但我在加载文件时遇到问题:

    我的理解是添加域。加载我应该创建并向它发送程序集的字节数组。我这样做:

    FileStream fs = new FileStream(assemblyFile, FileMode.Open);
    byte[] assemblyFileBuffer = new byte[(int)fs.Length];
    fs.Read(assemblyFileBuffer, 0, assemblyFileBuffer.Length);
    fs.Close();
    
    AppDomainSetup domainSetup = new AppDomainSetup();
    domainSetup.ApplicationBase = assemblyFileInfo.Directory.FullName;
    AppDomain tempAppDomain = AppDomain.CreateDomain("TempAppDomain", null, domainSetup);
    
    Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer);
    

    最后一行引发异常:

    无法加载文件或程序集“WindowsFormsApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。“}publicFormsAppSystem=null,指定的KeysApp1.0.0.0版本无法找到。”

    谢谢, 丹

    2 回复  |  直到 15 年前
        1
  •  1
  •   JaredPar    16 年前

    几乎可以肯定的是,WindowsFormApplication1的一个依赖项在构造的AppDomain中不可用,因此无法加载WindowsFormApplication1。为了告诉他们,你必须检查融合绑定日志,看看发生了什么。下面是一个关于如何调试程序集绑定失败以检测其根本原因的优秀教程。

        2
  •  0
  •   Rich C    12 年前

    http://blogs.msdn.com/brada/archive/2003/04/16/49974.aspx

    我最终使用了方法3,尽管它很难看: 看到了吗 KB 837908