.NET 4加载与.NET 3.5不同的程序集

时间:2012-01-27 14:31:46

标签: .net exception-handling assembly-resolution assemblyresolve

迁移到.net 4后,我们开始面对库的问题。 假设我们有我们的库MyLib.dll,它引用了Interop程序集Interop.dll。 Interop.dll引用了MissingInterop.dll。

因此引用可以显示为:MyLib.dll -> Interop.dll -> MissingInterop.dll

在MyLib.dll中,我们只使用Interop.dll中的部分类,因此我们永远不会调用任何需要MissingInterop.dll的内容,并且在.net 3.5中它运行得很好这就是为什么我们不发送MissingInterop .dll与MyLib.dll。

当我们在.net 4下运行的进程使用MyLib.dll时,应用程序失败,并出现以下异常:

  

FileNotFoundException:"无法加载文件或程序集' MissingInterop.dll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。系统找不到指定的文件。"`

另外我注意到Interop.dll引用了其他缺失的dll,但.net并没有尝试加载它们。我发现了差异。 MissingInterop.dll中的某些类型用于Interop.dll中的方法参数,而来自其他缺失库的类型仅用作方法返回类型,即在Interop.dll中我可以看到:

  Class C1
     MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&)
  Class C2
     get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()

并且.NET 4尝试加载MissingInterop.dll但是没有尝试加载AnotherMissingInterop.dll。

.NET 3.5没有尝试加载MissingInterop.dll和AnotherMissingInterop,因为它们未在执行路径中使用。

我知道.NET 4有新的Fusion,但我还没有发现任何地方描述的这种突破性变化。 有谁知道为什么.NET 4会尝试加载不需要的东西? 有没有办法解决这个问题,而无需重新编译代码或添加丢失的文件?

2 个答案:

答案 0 :(得分:1)

可能不是(来自经验)。在前面的步骤中存在类似的问题(不能记住它是2.0 - > 2.1或3.0 - > 3.1。但它是在一段时间之前)我们有机器报告早期版本已安装并崩溃。当我们清理网络安装并实际安装较低版本,然后更新时,一切正常。微软可能会偷偷推出一个补丁。我倾向于用MS来提高它。你有一个看似很好的重新研究的bug,并且在这种环境支持合同与否,他们非常不愿意最终收取你的费用。 (无论如何我的经历)

答案 1 :(得分:0)

当您将应用程序从.NET 3.0,3.5迁移到4.0时,您需要在外部将此mylib.dll包含到项目中并进行编译,或者如果可能,您需要汇编源代码,然后将其更改为.net 4.0