Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 调试针对Framework 4.0的项目时,将加载Framework 4.5程序集_Visual Studio_Visual Studio 2012_Multitargeting - Fatal编程技术网

Visual studio 调试针对Framework 4.0的项目时,将加载Framework 4.5程序集

Visual studio 调试针对Framework 4.0的项目时,将加载Framework 4.5程序集,visual-studio,visual-studio-2012,multitargeting,Visual Studio,Visual Studio 2012,Multitargeting,我需要能够使用Visual Studio 2012以.NET Framework 4.0为目标,并验证我的代码在部署到我们的4.0环境(Windows Server 2003)时是否能够正常工作 VisualStudio2012中的多目标功能似乎工作正常,但仅适用于mscorlib.dll。当引用任何其他框架DLL时,对于编译,您会得到适当的错误,例如引用4.0中不存在的类型,但在执行和调试期间加载了DLL的4.5版本 这使得我无法验证我的代码是否能在生产环境中正常工作,同时考虑到4.5版框架在

我需要能够使用Visual Studio 2012以.NET Framework 4.0为目标,并验证我的代码在部署到我们的4.0环境(Windows Server 2003)时是否能够正常工作

VisualStudio2012中的多目标功能似乎工作正常,但仅适用于
mscorlib.dll
。当引用任何其他框架DLL时,对于编译,您会得到适当的错误,例如引用4.0中不存在的类型,但在执行和调试期间加载了DLL的4.5版本

这使得我无法验证我的代码是否能在生产环境中正常工作,同时考虑到4.5版框架在就地升级中所做的突破性更改

我做了一些单元测试,通过测试4.0和4.5之间的一些差异来测试多目标功能。测试包含在他们自己的项目中,目标是他们正在测试的框架版本。所有测试都应该通过

针对MSCORLIB的测试 当
列表
位于
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(".");
        }
    });
}
[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(".");
        }
    });
}
[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));
}
框架4.5-通过-

[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(".");
        }
    });
}
[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(".");
        }
    });
}
[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版本已加载,这似乎是不相交的

有没有办法获得我想要的功能

更新


以下是我正在使用的方法。

据我所知,这正是它应该如何工作的。您的计算机和GAC中没有.NET 4.0。在运行时,您总是使用.NET 4.5,因为它是就地升级(安装.NET 4.5会覆盖.NET 4.0)。引用的程序集和多目标仅适用于IntelliSense、对象浏览器和MSBuild(通常是设计时工具)

谢谢你的大力支持

在查看您的项目时,有两件事会影响您的结果,导致您看到的行为:

<强> 1)< /强>当我们检测到在4.5下运行的4个应用程序时,我们认为“SHIM”改变API来返回旧的4行为,当我们认为它可以从合理的应用程序(即非设计的)使用时观察到。例如,依赖于修改list.ForEach中列表的功能的4.0应用程序将继续看到4.0行为,无论是在4.0还是4.5下运行。4.5应用程序将看到新的行为

为了确定我们认为合理的使用,并指导API,我们有一个兼容的团队负责整个框架中的每一个“突破”变化,并将它与过去10年中建立起来的规则和准则进行比较。 在您所附的项目中,您正在测试5项内容:

  • 4.5下的List.ForEach在修改列表时抛出InvalidOperationException
  • 4.5下的Uri现在保留路径分段中的尾随点
  • 4.5下的Uri不再转义?在里面file://-based URI
  • 4.5下的Enumerable.Empty现在保证它返回相同的实例(这一个在文档中有点误导[我已经提交了一个bug],我相信这个行为是在4.0上,它可以在第一次被多进程机器上的两个不同线程同时访问时返回两个不同的实例)
  • MEF的目录不再是XML序列化的
在这些行为中,当4.0应用程序运行时,前三个行为将被填充以返回4.5上的前一个行为。然而,最后两个未加垫片。这是因为最后两次更改会破坏非常人为的应用程序用法,在这种情况下,我们只需将它们记录在上面作为参考。例如,以MEF目录更改为例,虽然理论上您可以使用XML序列化程序序列化这些类型(这是无意的,而且是XML序列化程序的一种可怕行为),但您无法对结果执行任何操作,因为它没有反序列化为任何有用的内容

我正在研究是否可以修改该页面,以包含为4.0应用程序填充的破坏性更改列表

2)我遇到的第二个问题是,当4.0测试项目与另一个基于4.5的测试项目处于同一运行状态时,它们被错误地检测为4.5。您可以通过自己运行4.0测试来观察这一点,三个shimed测试将通过。将它们与4.5测试一起运行,它们将失败。我不确定这个问题在哪里起作用,但我已经在内部提交了一个bug,并与负责的团队启动了一个线程,以弄清它的真相。如果您想在外部跟踪问题,请随时提交错误,我们将转发给正确的所有者

大卫·基恩


CLR团队

您所有的引用都设置正确了吗?我们已经收到David Kean关于单元测试行为的错误报告。我们将在未来的VS更新中调查并解决此反馈。Mathew Aniyan Visual Studio单元测试团队。如果这是真的,那么在调试针对framework 4.0的项目时,Visual Studio如何以及为什么加载4.0版本的
mscorlib.dll
,当调试一个针对4.5的项目时,4.5版本的
mscorlib.dll
?今晚我会让开发人员详细回答这个问题。我有一个问题仍然没有得到答案:为什么?为什么所有这些复杂性和糟糕的文档记录的魔术,而不是简单地增加版本和做一切“如预期”在.NET世界?即使有好的文档,这一点也永远不会清楚。就地升级是您在.NET世界中所能做的最糟糕的体系结构决策之一,那么为什么它应用于.NET本身呢?哇!感谢David的详细回复。现在,了解了摆振行为,一切都变得更有意义了。我真的很感谢你带我去