首页 > 解决方案 > 使用 Microsoft.Build 程序集构建 VS2017 解决方案:执行期间出错

问题描述

我想开始使用来自另一个代码的 Miscrosoft.Build 程序集编译 VS2017 解决方案。

这是我的简化代码:

namespace Test
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            RebuildSolution(@"mySolution.sln", "Release", "x86", "4.6.1");
        }

        /// <summary>
        /// Rebuild visual studio solution.
        /// </summary>
        /// <param name="slnPath">Path to .sln file</param>
        /// <param name="configuration">Configuration to use (Release, Debug, ...)</param>
        /// <param name="platform">Target platform (x86, x64, AnyCPU, ...)</param>
        /// <param name="toolsversion">Tools version to use (4.0, 12.0, ...)</param>
        public static void RebuildSolution(string slnPath, string configuration, string platform, string toolsversion)
        {
            if (!File.Exists(slnPath))
            {
                throw new Exception("sln file does not exist : " + slnPath);
            }

            ConsoleLogger cl = new ConsoleLogger(LoggerVerbosity.Minimal);

            Dictionary<string, string> globalProperty = new Dictionary<string, string>
            {
                { "Configuration", "Release" },
                { "Platform", "x86" },
                { "RebuildT4Templates" , "false" },
                { "ToolsVersion", "15.1" },
                { "VisualStudioVersion", "15.1" }
            };

            BuildRequestData buildRequest = new BuildRequestData(slnPath, globalProperty, null, new string[] { "Rebuild" }, null);

            BuildParameters bp = new BuildParameters();
            bp.Loggers = new List<ILogger> { cl }.AsEnumerable();

            BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
        }
    }
}

将最新版本 (15.1.0.0) 的 Miscrosoft.Build.* 程序集添加到我的解决方案后,我收到了无法修复的错误消息(在执行期间):

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\Microsoft.CSharp.Core.targets(52,5): error MSB4127: Impossible d'instancier la tâche "Csc" à partir de l'assembly “C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\Microsoft.Build.Tasks.CodeAnalysis.dll”。Vérifiez que l'assembly de tâche a été généré à l'aide de la meme version de l'assembly Microsoft.Build.Framework que celle installée sur votre ordinateur et qu'il ne manque pas de redirection de liaison pour Microsoft.Build.Framework dans votre application hôte。Impossible d'effectuer un cast d'un object de type 'Microsoft.CodeAnalysis.BuildTasks.Csc' en type 'Microsoft.Build.Framework.ITask'。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\Microsoft.CSharp.Core.targets(52,5): error MSB4060: La tâche "Csc" a été déclarée ou utilisée de manière wronge, ou a échoué penda nt la construction。Vérifiez l'orthographe du nom de la tâche et de l'assembly。

(对不起法语)

你能帮帮我吗?

标签: c#.netmsbuildvisual-studio-2017

解决方案


它与找不到工具集有关。

类似于这个问题的东西。这个问题好像是在vs2017(15.x)之后出现的。

我按照你的步骤,遇到了同样的问题,如下所示: 在此处输入图像描述

我在本文档中找到了有用的信息:

Visual Studio 2017 及更高版本不再将 MSBuild 放在 GAC 中或修改注册表。不幸的是,这意味着希望使用 MSBuild API 评估或构建项目的应用程序不能隐式依赖 Visual Studio 安装。

这是我测试它的文档中描述的简单解决方法:

  1. 在 vs 中,转到解决方案资源管理器=>references,将(更改所有 Microsoft.Build 和 Microsoft.Build.XXX)的Copy Local属性Microsoft.Build.*从 true 更改为 false。

  2. 将 NuGet 包引用添加到Microsoft.Build.Locator

  3. 在调用任何使用 MSBuild 的方法之前添加对 Locator API 的调用。 MSBuildLocator.RegisterDefaults();// 在调用 RebuildSolution(...) 之前调用 Locator API

  4. 构建项目并确保it doesn't contain any Microsoft.Build.*.dll assemblies other than Microsoft.Build.Locator.dll.

  5. 另外,如果你想用 构建项目X86,你必须定义 X86 属性(可以在 xx.csproj 中找到)。所以我建议你可以使用 { "Platform", "Any CPU" } 如果你没有在你构建的项目中定义配置。


推荐阅读