c# - 使用 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。
(对不起法语)
你能帮帮我吗?
解决方案
它与找不到工具集有关。
类似于这个问题的东西。这个问题好像是在vs2017(15.x)之后出现的。
我在本文档中找到了有用的信息:
Visual Studio 2017 及更高版本不再将 MSBuild 放在 GAC 中或修改注册表。不幸的是,这意味着希望使用 MSBuild API 评估或构建项目的应用程序不能隐式依赖 Visual Studio 安装。
这是我测试它的文档中描述的简单解决方法:
在 vs 中,转到解决方案资源管理器=>references,将(更改所有 Microsoft.Build 和 Microsoft.Build.XXX)的
Copy Local
属性Microsoft.Build.*
从 true 更改为 false。将 NuGet 包引用添加到Microsoft.Build.Locator。
在调用任何使用 MSBuild 的方法之前添加对 Locator API 的调用。
MSBuildLocator.RegisterDefaults();
// 在调用 RebuildSolution(...) 之前调用 Locator API构建项目并确保
it doesn't contain any Microsoft.Build.*.dll assemblies other than Microsoft.Build.Locator.dll
.另外,如果你想用 构建项目
X86
,你必须定义 X86 属性(可以在 xx.csproj 中找到)。所以我建议你可以使用 { "Platform", "Any CPU" } 如果你没有在你构建的项目中定义配置。
推荐阅读
- javascript - 我无法清除绿屏程序上的画布
- git - 为什么 IntelliJ 会自动将我的“开发”分支中的更改加载到“主”分支中?
- html - 创建具有非滚动列标题的 CSS 网格
- c++ - Qt5 - C++ - QImage - 不正确缩放
- vsto - 如何在 C# 中将“公共部分类 ThisWorkbook”添加到 VSTO 应用程序?
- javascript - 将 prop 值传递给 svg Vue.js 组件中动态构建的点击事件
- android - 如何在本机反应中将事件添加到谷歌日历
- excel - Excel VBA代码用于从选择行中自动填充序列号
- python - 为什么增加Epoch后损失函数输出NaN?
- sql - SqlCmd 命令执行停止