c# - 如何以编程方式使用 MSBuild 构建 DotNet Core 项目
问题描述
我想构建 .Net Core 3.1 解决方案,该解决方案具有 API 项目和 Businesslayer 以及来自 C# 代码的另外 2 层。我正在使用 BuildManager 来构建解决方案。
string projectFileName = @"D:\SampleUserApplication\SampleUserApplication.sln";
ProjectCollection pc = new ProjectCollection();
Dictionary<string, string> GlobalProperty = new Dictionary<string, string>();
GlobalProperty.Add("Configuration", "Release");
GlobalProperty.Add("Platform", "Any CPU");
GlobalProperty.Add("OutputPath", solution_name);
//GlobalProperty.Add("MSBuildExtensionsPath", msbuildRoot);
BuildParameters bp = new BuildParameters(pc);
bp.Loggers = new[] {
new FileLogger
{
Verbosity = LoggerVerbosity.Detailed,
ShowSummary = true,
SkipProjectStartedText = true
}
};
BuildManager.DefaultBuildManager.BeginBuild(bp);
BuildRequestData BuildRequest = new BuildRequestData(projectFileName, GlobalProperty, null, new string[] { "Build" }, null);
BuildSubmission BuildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(BuildRequest);
BuildSubmission.Execute();
BuildManager.DefaultBuildManager.EndBuild();
if (BuildSubmission.BuildResult.OverallResult == BuildResultCode.Failure)
{
//throw new Exception();
}
但是构建失败并出现以下错误:
MSBUILD:警告 MSB4196:无法从预期位置“D:\NOCodeRespository\NoCode\NoCode\NoCodeAPI\bin\Debug\netcoreapp3.1”成功加载“.overridetasks”文件。默认任务不会被覆盖。
MSBUILD:警告 MSB4010:无法从预期位置“D:\NOCodeRespository\NoCode\NoCode\NoCodeAPI\bin\Debug\netcoreapp3.1”成功加载“.tasks”文件。默认任务将不可用。D:\SampleUserApplication\SampleUserApplication.sln.metaproj :
错误 MSB4036:未找到“消息”任务。检查以下内容: 1.) 项目文件中的任务名称与任务类的名称相同。2.) 任务类是“公共的”并且实现了 Microsoft.Build.Framework.ITask 接口。3.) 在项目文件或位于“D:\NOCodeRespository\NoCode\NoCode\NoCodeAPI\bin\Debug\netcoreapp3.1”目录中的 *.tasks 文件中正确声明了任务。在项目“SampleUserApplication.sln”中完成构建目标“ValidateSolutionConfiguration”——失败。完成构建项目“SampleUserApplication.sln”——失败。构建失败。
我尝试添加环境变量,例如:
var msbuildRoot = @"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild";
// var msbuildExe = Path.Combine(msbuildRoot, @"19.0\Bin\MsBuild.exe");
var sdkPath = Path.Combine(msbuildRoot, "Sdks");
//Environment.SetEnvironmentVariable("MSBUILD_EXE_PATH", msbuildExe);
Environment.SetEnvironmentVariable("MSBUILDSDKSPATH", sdkPath);
Environment.SetEnvironmentVariable("MSBuildExtensionsPath", msbuildRoot);
最后
GlobalProperty.Add("MSBuildExtensionsPath", msbuildRoot);
但没有任何结果。经过长时间的谷歌搜索,我也没有找到任何解决方案。我希望有人对此有解决方案。
解决方案
推荐阅读
- bash - 如何克隆多个特定的子模块?
- javascript - 为什么我不能记录这个 td 元素数组?
- c++ - spdlog 记录器构造 - make_unique 无法编译
- javascript - ReactJS Tic Tac Toe - 用它编写 OnClick 事件的不同方式
- objective-c - Mac OS:CAAnimation - 无缝更新动画
- python - 使用 Pipenv 开发 Python 库
- javascript - 当 IOS 上的 ALPHA 为零时,Three.js 将纹理 RGB 值设置为零
- node.js - 生产环境中的最佳实践 node.js 推荐端口是什么?
- php - SuiteCRM - zip 文件缺少 manifest.php 文件。无法继续
- object-detection - 在 AWS Sagemaker 中使用大尺寸图像(例如 2000 x 2000)作为训练数据时,它们是否会自动缩放到 300 x 300?