将Visual Studio 2010项目转换为Visual Studio 2012

5
我的朋友给我发送了一个VS2010项目,其中包含两个解决方案:一个包含一个CPP文件,另一个解决方案包含一个C# WPF项目(一个XAML和一个CS)。他在他的计算机上使用VS2010一切正常。当他构建并执行该项目时,主XAML窗口将会出现。
当我在我的计算机上使用VS2012尝试做同样的事情时,我没有问题来构建该项目。然而,当我运行它时,什么也没有发生。我在C#代码中添加了一些断点,我意识到代码正在运行,但是窗口从未显示。所以,一旦代码已经执行,应用程序就会退出,而不是在XAML界面内等待用户输入。
我以前从未遇到过这个问题,通常从VS2010到VS2012转换相当顺利。同样,在这里,似乎一切都很好...除了在运行项目时XAML窗口不会出现,这真是相当困扰人。
有人知道那里发生了什么吗?我可能错过了一些基本的东西,但我没有看到任何可以确保在启动项目时运行XAML窗口的解决方案或项目属性设置。

值得注意的是,VS 2012 安装了 .NET 4.5,它是 .NET 4 的原地升级。可能会有一个导致您的应用程序崩溃的错误。是否定义了任何非默认的预处理器? - PrimeNerd
我查看了目标框架,它仍然是4.0版本。为了确保,我尝试了3.5版本,但没有帮助。我将尝试从头开始重新启动项目,但这需要一些时间。我不明白为什么微软会制造出相互之间交互如此糟糕的产品。 - dan
1个回答

0
需要注意的一点是,4.5编译器已经改变了foreach循环中lambda表达式的语义,因此您的应用程序可能会遇到问题。请参见这里:https://connect.microsoft.com/VisualStudio/feedback/details/732657/c-5-compiler-doesnt-respect-the-semantics-of-the-foreach-range-variable-when-langversion-5 基本上,如果您有像这样的代码:
List<Action<int>> actions = new List<Action<int>>();
foreach (var x in new[] { 10, 20, 30 })
{
   actions.Add(() => Console.WriteLine("x = {0}", x);
}

actions.ForEach(a => a());

根据编译时使用的4.0或4.5版本,结果会有所不同。我们因为构建机仍然是4.0版本,而将开发机升级到了VS 2012,所以遇到了这个问题。


1
你的代码在所有编译器上都无法编译。应该改为 List<Action> actions = new List<Action>(); 吗? - linquize
结果:这是真的吗?.NET 4编译器{30, 30, 30};.NET 4.5编译器{10, 20, 30}。 - linquize
是的,应该是这样的。基本上在4.0中,lambda将引用相同的变量作用域,在4.5中编译器为每个迭代创建一个新的作用域。 - Philipp Aumayr
我最终决定从头开始一个新项目,现在它运行良好。我会接受您的答案来关闭这个话题。这种情况非常恼人,因为当项目编译器的版本(例如.NET 3.5、4.0或4.5)设置为高于已安装版本时,基本上没有改变它的方法(Visual Studio只告诉你安装更新的.NET框架版本,然后关闭项目)。 - dan
过去,我们避免编写这样的代码,因为lambda中的x值不是常量。 - linquize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接