如何在C#中以编程方式构建解决方案?

时间:2011-06-28 18:33:21

标签: c# msbuild build project solution

如何以编程方式构建C#解决方案?我应该能够通过解决方案的路径并获取输出消息(或者只是构建解决方案)我如何在C#中实现这一目标?

7 个答案:

答案 0 :(得分:30)

有关使用.NET 4.0 MSBuild API的示例,请参阅此链接:

http://www.odewit.net/ArticleContent.aspx?id=MsBuildApi4&format=html

List<ILogger> loggers = new List<ILogger>();
loggers.Add(new ConsoleLogger());
var projectCollection = new ProjectCollection();
projectCollection.RegisterLoggers(loggers);
var project = projectCollection.LoadProject(buildFileUri); // Needs a reference to System.Xml
try
{
    project.Build();
}
finally
{
    projectCollection.UnregisterAllLoggers();
}

一个更简单的例子:

var project = new Project(buildFileUri, null, "4.0");
var ok = project.Build(); // or project.Build(targets, loggers)
return ok;

请记住使用.NET 4配置文件(而不是客户端配置文件)。

添加以下引用:System.XML,Microsoft.Build,Microsoft.Build.Framework以及可选的Microsoft.Build.Utilities.v4.0。

另见:

running msbuild programmatically

要构建解决方案,请执行以下操作:

var props = new Dictionary<string, string>();
props["Configuration"] = "Release";
var request = new BuildRequestData(buildFileUri, props, null, new string[] { "Build" }, null);
var parms = new BuildParameters();
// parms.Loggers = ...;

var result = BuildManager.DefaultBuildManager.Build(parms, request);
return result.OverallResult == BuildResultCode.Success;

答案 1 :(得分:20)

大多数人都提供了通过调用外部命令来实现这一目的的方法,但是 是一个api,Microsoft.Build.Framework,通过C#构建


博客代码:

using Microsoft.Build.BuildEngine;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

public class SolutionBuilder
{
    BasicFileLogger b;
    public SolutionBuilder() { }

    [STAThread]
    public string Compile(string solution_name,string logfile)
    {
        b = new BasicFileLogger();
        b.Parameters = logfile;
        b.register();
        Microsoft.Build.BuildEngine.Engine.GlobalEngine.BuildEnabled = true;
        Project p = new Project (Microsoft.Build.BuildEngine.Engine.GlobalEngine);
        p.BuildEnabled = true;
        p.Load(solution_name);
        p.Build();
        string output = b.getLogoutput();
        output += “nt” + b.Warningcount + ” Warnings. “;
        output += “nt” + b.Errorcount + ” Errors. “;
        b.Shutdown();
        return output;
    }
}
//The above class is used and compilation is initiated by the following code,
static void Main(string[] args)
{
    SolutionBuilder builder = new SolutionBuilder();
    string output = builder.Compile(@”G:CodesTestingTesting2web1.sln”, @”G:CodesTestingTesting2build_log.txt”);
    Console.WriteLine(output);
    Console.ReadKey();
}

请注意该博客中的代码有效,但有点过时了

Microsoft.Build.BuildEngine

已被分解成一些

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

答案 2 :(得分:5)

// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";

Process.Start(pathToMsBuild + " " + pathToSolution);

答案 3 :(得分:2)

您可以创建.proj文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <!-- Common -->
    <Solution Include="Common\Util\Util.sln"/>
    <Solution Include="Common\EventScheduler\EventSchedulerSolution\EventSchedulerSolution.sln"/>
    <!-- Server -->
    <Solution Include="Server\DataLayer\DataTransferObjects\SharedModel\SharedModel.sln"/>
    <Solution Include="Server\DataLayer\DataTier\ESPDAL.sln"/>
    <!-- Internal Tools -->
    <Solution Include="InternalTools\ServerSchemaUtility\ServerSchemaUtility.sln"/>
  </ItemGroup>
  <Target Name="Rebuild">
    <MSBuild Projects="@(Solution)" Targets="Rebuild" Properties="Configuration=Release"/>
  </Target>
</Project>

然后使用proj文件作为参数调用msbuild.exe,下面是批处理文件示例。从C#开始,您可以调用Process.Start,如其他海报所示。

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" BuildSolutions.proj

pause

答案 4 :(得分:2)

答案 5 :(得分:1)

如果您需要从Visual Studio扩展代码中触发构建,则必须考虑IVsBuildManagerAccessor接口所施加的限制 - 请参阅 一般说明包括新的IVsBuildManagerAccessor.docx 来自Managed Package Framework for Projects。 它的分叉也可以在github获得。

  

在带有MSBuild 4.0的Visual Studio 2010中,有新的交互   解决方案构建管理器和MSBuild之间影响项目   利用这些服务的系统。 MSBuild 4.0包含一个新的   组件称为构建管理器(不要混淆   解决方案构建管理器,它是一个控制组件的VS组件   提交构建请求。这成为Visual Studio的必要条件   2010现在允许并行构建(特别是本机项目)和   访问共享资源,例如需要调解的CPU。对于   之前简单地称为Project.Build()的项目系统   调用构建必须进行多次更改。现在是项目系统   必须:

     
      
  1. 使用IServiceProvider接口请求SVsBuildManagerAccessor服务。这应该在不久之后完成   项目系统在任何构建可能发生之前就已加载。
  2.   
  3. 如果您需要UI线程,请通知系统
  4.   
  5. 如果您正在进行设计时构建,请通知系统。
  6.   
  7. 使用Build Manager Accessor注册其记录器。
  8.   
  9. 直接向MSBuild Build Manager提交构建请求,而不是在Project上调用方法。
  10.   

答案 6 :(得分:0)

当然,您可以使用msbuild构建任何Visual Studio解决方案文件。

我相信您可以使用Process.Start使用适当的参数调用msbuild。