【问题标题】:MSBuild called by Process.Start() behaving differently between VS2010 and VS2013?由 Process.Start() 调用的 MSBuild 在 VS2010 和 VS2013 之间表现不同?
【发布时间】:2015-06-25 12:49:25
【问题描述】:

我同时安装了 VS2010 和 VS2013,并试图通过调用 MSBuild (C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319) 来运行编译 .net 4.0 解决方案的程序。

作为记录,执行此操作的代码如下所示:

var processStartInfo = new ProcessStartInfo
            {
                FileName = pathToMSBuild,
                Arguments = "C:\path\to\mySolution.sln /nr:false",
                CreateNoWindow = true,
                UseShellExecute = false
            };
            var process = Process.Start(processStartInfo);
            process.WaitForExit();

我检查了 .sln,其中包含一个 .vcxproj 和 .csproj 文件,这些文件仅包含对 ToolsVersion=4.0 的引用。

当我在 VS2010 中执行程序(或打开 cmd.exe 并自己运行 MSBuild 命令)时,它可以正常工作并编译解决方案。但是,当我使用 VS2013 运行相同的程序时,我从 MSBuild 收到以下错误:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\CodeAnalysis\Micros
oft.CodeAnalysis.targets(214,5): error MSB4175: The task factory "CodeTaskFacto
ry" could not be loaded from the assembly "C:\WINDOWS\Microsoft.NET\Framework64
\v4.0.30319\Microsoft.Build.Tasks.v12.0.dll". Could not load file or assembly '
file:///C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Build.Tasks.v
12.0.dll' or one of its dependencies. The system cannot find the file specified
. [C:\...\solution\myProject.vcxproj]

我在 msdn 上找到了 this answer,它实际上为我解决了这个问题 - 在从该文件中注释掉有问题的行之后,我可以从 VS2013 成功调用 MSBuild。但我不明白为什么这是相关的,因为我认为我正在运行 v4.0 MSBuild 来编译带有 ToolsVersion=4.0 的项目。

这大概是由于我在使用 VS2013 运行/调试程序时设置了一些环境变量?我在互联网上找不到任何详细信息。请问有人能解释一下这里发生了什么吗?

【问题讨论】:

  • 路径错误,Microsoft.Build.Tasks.v12.0.dll 不在该目录下。不要通过复制文件来解决问题,这只会产生两个问题。
  • 好点@HansPassant .. 我给了 OP 功劳,因为我不够牛仔复制文件?我希望我下面的规范点能引导 OP 深入挖掘
  • 我确实不够牛仔,无法复制文件,但不幸的是仍然被你们的两个 cmets 弄糊涂了。我可以看到缺少 Microsoft.Build.Tasks.v12.0.dll 但我想我真正的问题是为什么我在 VS2010 中运行我的程序时它没有抱怨这个?

标签: c# visual-studio-2010 visual-studio-2012 visual-studio-2013 msbuild


【解决方案1】:

您可以尝试将 /v:diag 开关添加到您的参数中。这将导致 msbuild 运行时输出详细程度设置为诊断。这将在每次调用开始时向您显示 env var 和应用程序域的状态,并可能帮助您识别差异。

注意 - 完成后将其取出,因为它会显着减慢构建过程。

【讨论】:

    【解决方案2】:

    问题

    错误是无法加载文件或程序集系统找不到指定的文件..vcxproj

    疑难解答

    打开ProcessMonitor 并运行构建过程,直到它抛出错误。失败时停止跟踪并调查 ProcMon 的 (Filemon) 日志以查看 MSBuild 在哪里寻找它无法找到的 .vcxproj 或 .xyz 文件/程序集。解决那个!!

    解决方案

    将文件放在期望找到的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多