编辑:没关系,事实证明该任务实际上没有实现Microsoft.Build.Framework.ITask
接口。我曾做过错误的假设。 D'哦!
我使用Visual Studio 2015.
相关代码:
string solutionFilePath = args.Single();
var fileLogger = new FileLogger { Verbosity = LoggerVerbosity.Detailed, Parameters = @"logfile=C:\MSBuildResults.txt" };
var projectCollection = new ProjectCollection {DefaultToolsVersion = "14.0"};
var buildParameters = new BuildParameters(projectCollection) { Loggers = new List<ILogger> { fileLogger } };
var globalProperties = new Dictionary<string, string> { { "Configuration", "Debug" }, { "Platform", "Any CPU" } };
var buildRequestData = new BuildRequestData(solutionFilePath,
globalProperties,
targetsToBuild: new[] { "Build" },
toolsVersion: "14.0",
hostServices: null);
BuildResult buildResult = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequestData);
buildResult.OverallResult
为BuildResultCode.Failure
,并在我的日志文件中打印了以下错误消息:
C:\ Workspaces \ SomeProject.csproj(67,5):错误MSB4127:“DummyTask” 无法从程序集中实例化任务 “\ networkDrive \ Dummy.dll”。请验证任务组件是否已经完成 使用相同版本的Microsoft.Build.Framework程序集构建 作为您计算机上安装的那个和您的主机应用程序 没有错过Microsoft.Build.Framework的绑定重定向。 无法将“DummyTask”类型的对象强制转换为类型 'Microsoft.Build.Framework.ITask'。
根据建议here,我在我的计划的<bindingRedirect>
文件中添加了.exe.config
标记。尽管如此,仍然会抛出相同的错误消息。
我没有使用Microsoft.Build
库,而是决定使用MSBuild.exe
(我知道not recommended)来调用Process.Start()
:
var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe")
{
Arguments = $"{solutionFilePath} /t:Build",
RedirectStandardOutput = false,
UseShellExecute = true,
CreateNoWindow = false
};
var process = Process.Start(processStartInfo);
process.WaitForExit();
process.Close();
这一次,构建成功,并且流程完成,退出代码为0。
使用Microsoft.Build
库构建解决方案时,我做错了什么?当我使用BuildManager
时,我应该怎么做才能确保构建成功?
如果您需要更多信息来帮助解决我的问题,请与我们联系。