16

随着迁移到 .net 4,我们开始面临库的问题。假设我们有我们的库 MyLib.dll,它引用互操作程序集 Interop.dll。Interop.dll 引用了 MissingInterop.dll。

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

在 MyLib.dll 中,我们仅使用来自 Interop.dll 的部分类,因此我们从不调用任何需要 MissingInterop.dll 的东西,而在 .net 3.5 中它工作得很好这就是我们不使用 MyLib.dll 发布 MissingInterop.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 会尝试加载不需要的东西吗?有没有办法在不重新编译代码或添加丢失文件的情况下解决这个问题?

4

2 回答 2

1

可能不是(根据经验)。在较早的步骤中存在类似的问题(不记得是 2.0 -> 2.1 还是 3.0 -> 3.1。但那是不久前的事了)我们有机器报告安装了较早的版本并崩溃。当我们清理网络安装并实际安装较低版本,然后进行更新时,一切正常。微软可能会偷偷出一个补丁。我倾向于用 MS 来提高它。你有一个看似经过充分研究的 bug,在这种情况下,无论是否支持合同,他们都非常不愿意最终向你收费。(反正我的经验)

于 2012-02-14T11:49:13.827 回答
0

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

于 2012-02-22T10:28:13.480 回答