1

有没有一种快速的方法来测试给定的 dll 是否包含只能使用 .net 4.5 运行的代码,而无需实际尝试通过任何 CLR 加载它?

背景:我有一个 DLL,我正在编译到 4.0 目标,但使用 .net 4.5 (vs 2012) 工具集。我的运行环境没有安装4.5。我正在使用AsyncTargetingPack编写异步代码,并将代码定位到 .net 4.0。

我想确保我没有意外搞砸会导致我的 DLL 引用某些仅 .net 4.5 的类/命名空间的事情。

4

2 回答 2

1

除非有重大的 CLR 版本更改,否则这是不可能的。从 .NET 1.0 到 1.1、1.1 到 2.0 和 3.5 到 4.0。中间版本没有 CLR 版本更改,也没有从 4.0 到 4.5 的版本

这导致了 WaitHandle.WaitOne(int) 方法的一个非常臭名昭著的问题,该方法被添加到 mscorlib 的 .NET 2.0 SP1 版本中。没有相应的改变[AssemblyVersion],仍然是2.0.0.0。因此,程序员在不知不觉中使用了重载,并在没有安装服务包的机器上安装了代码炸弹。

Microsoft 在 .NET 4 中修复了该问题,引用程序集不再是运行时程序集的副本。它们只包含元数据,没有 IL。这反过来又允许他们更改公共类而不用担心会破坏任何东西,参考程序集没有更新。.NET 4 的许多更新已经发布,从未听说过事故。

.NET 4 到 4.5 也是如此。当您使用 4.0 参考程序集时,您可以确保不会意外使用 4.5 特定的类或方法。实际上使用 4.5 添加的功能需要使用 4.5 参考程序集进行编译。

于 2012-07-18T12:56:55.857 回答
0

使用 .NET Reflector,您可以打开程序集/dll 并查看其目标运行时和平台目标。ildasm.exe 也可以为您执行此操作,但查看标头会更加晦涩难懂。查找它的 /header 选项。

ildasm.exe 可以从 Visual Studio 命令提示符运行。

于 2012-07-18T08:42:56.723 回答