从文件加载.dll / .exe到临时AppDomain会抛出异常

时间:2009-09-23 15:52:26

标签: .net assemblies

我正在尝试创建一个Visual Studio AddIn,从当前解决方案中的项目中删除未使用的引用(我知道这可以完成,Resharper会这样做,但我的客户不想支付300个许可证)。 Anyhoo,我使用DTE循环遍历项目,编译它们的程序集,然后反映这些程序集以获取它们引用的程序集并交叉检查.csproj文件。

问题:因为装载了Reflection的.dll / .exe在app domian卸载之前没有卸载,所以它现在被锁定并且项目无法再次构建,因为VS尝试重新创建文件(所有标准的东西)。我已经尝试创建临时文件,然后反映它们......没有工作,仍然锁定原始文件(我完全不明白BTW)。现在我正在创建一个临时AppDomain来加载文件然后销毁。我在加载文件时遇到问题:

我理解AddDomain.Load的方式是我应该创建并发送程序集的字节数组。我这样做:

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'或其依赖项之一。系统找不到指定的文件。”:“WindowsFormsApplication3,Version = 1.0。 0.0,Culture = neutral,PublicKeyToken = null“}”

任何帮助或想法将不胜感激。我的头不能靠在墙上击打......

谢谢, 丹

2 个答案:

答案 0 :(得分:1)

这里几乎可以肯定的是,WindowsFormApplication1的一个依赖项在构造的AppDomain中不可用,因此它无法加载WindowsFormApplication1。为了告诉他们你将不得不检查融合绑定日志以查看发生了什么。这是一个很好的教程,介绍如何调试程序集绑定失败以检测其根本原因。

答案 1 :(得分:0)

我基本上都在尝试做同样的事情并遇到同样的问题。显然这不起作用。

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

我最终使用方法3,虽然它很难看: 见KB 837908