我需要能够使用 Visual Studio 2012 以 .NET Framework 4.0 为目标,并验证我的代码在部署到我们的 4.0 环境 (Windows Server 2003) 时是否能够正常工作。
Visual Studio 2012 中的多目标功能似乎可以正常工作,但仅适用于mscorlib.dll
. 当引用任何其他框架 DLL 时,编译时会出现正确的错误,例如引用 4.0 中不存在的类型,但 DLL 的 4.5 版本在执行和调试期间加载。
考虑到 4.5 版本框架所做的就地升级中的重大更改,这使得无法验证我的代码是否可以在生产环境中正常工作。
我做了一些单元测试,通过执行MSDN上的 4.0 和 4.5 之间的一些差异来测试多目标功能。这些测试包含在他们自己的项目中,这些项目针对他们正在测试的框架版本。所有测试都应该通过。
针对 MSCORLIB 的测试
这些测试成功通过,List<string>
位于mscorlib.dll
:
框架 4.0: -通过-
[TestMethod]
public void List_Foreach_should_not_throw_if_list_is_modified() {
var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };
list.ForEach((s) => {
if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
list.Add(".");
}
});
}
框架 4.5: -通过-
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void List_Foreach_should_throw_if_list_is_modified() {
var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };
list.ForEach((s) => {
if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
list.Add(".");
}
});
}
针对其他框架 DLL 的测试
然而,这些测试不能正常工作(4.5 一个通过,4.0 一个不通过),因为这些类型被发现System.ComponentModel.Composition.dll
并且总是加载 4.5 版本:
框架 4.0 - 失败,抛出 4.5- 预期的异常
[TestMethod]
public void Should_be_able_to_create_a_serializer_for_MEF_catalogs()
{
var catalog = new AggregateCatalog();
var serializer = new XmlSerializer(typeof(AggregateCatalog));
}
框架 4.5 -通过-
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void Should_not_be_able_to_create_a_serializer_for_MEF_catalogs()
{
var catalog = new AggregateCatalog();
var serializer = new XmlSerializer(typeof(AggregateCatalog));
}
这是设计好的吗?考虑到 mscorlib 的 4.0 版本已加载但每个其他程序集的 4.5 版本似乎是不相交的。
有没有办法获得我想要的功能?
更新
这是我正在使用的解决方案/项目。