.NET 4如何加载不同于.NET 3.5的程序集?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

随着迁移到.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: "Could not load file or assembly 'MissingInterop.dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."`

另外我注意到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会尝试加载不需要的东西吗?有没有办法解决这个问题,而不重新编译代码或添加缺少的文件?

提问于
用户回答回答于

当你将你的应用程序从.NET 3.0,3.5移植到4.0时,你需要将这个mylib.dll包含到你的项目中并编译它们,或者如果可能的话,你有程序集的源代码,然后把它改成.net 4.0

用户回答回答于

可能不是(从经验)。在前面的步骤中存在类似的问题(不记得它是2.0 - > 2.1还是3.0 - > 3.1,但是不久前)我们有机器报告早期版本已安装并崩溃。当我们清理网络安装并实际安装了较低版本,然后更新时,所有工作都正常。微软可能会偷袭一个补丁。我倾向于用MS来提高它。你有一个看似不错的重新发现的bug,并且在这种情况下支持合同与否,他们非常不愿意收取你的费用。(无论如何我的经验)

扫码关注云+社区