Как мне построить решение программно в C #? - PullRequest
30 голосов
/ 28 июня 2011

Как мне построить решение C # программно?Я должен быть в состоянии пройти путь решения и получить выходные сообщения (или просто построить решение), как мне добиться этого в C #?

Ответы [ 7 ]

30 голосов
/ 23 мая 2012

См. Эту ссылку для примера использования API .NET 4.0 MSBuild:

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.

Также смотрите здесь:

программный запуск msbuild

Чтобы построить решение, выполните следующие действия:

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;
20 голосов
/ 28 июня 2011

Большинство из вас предоставляют способы сделать это, вызывая внешние команды, но - это 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

5 голосов
/ 28 июня 2011
// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";

Process.Start(pathToMsBuild + " " + pathToSolution);
2 голосов
/ 22 июля 2013
2 голосов
/ 28 июня 2011

Вы можете создать файл .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>

и затем вызовите msbuild.exe, используя в качестве аргумента файл proj, ниже приведен пример пакетного файла. Из C # вы можете вызвать Process.Start, как указано другими авторами.

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

pause
1 голос
/ 10 июня 2015

Если вам нужно выполнить сборку из кода расширения Visual Studio, вы должны учитывать ограничения, налагаемые интерфейсом IVsBuildManagerAccessor - см. Общие замечания, включая новые IVsBuildManagerAccessor.docx из Структура управляемых пакетов для проектов . Его вилка также доступна на github .

В Visual Studio 2010 с MSBuild 4.0 появились новые взаимодействия между Solution Build Manager и MSBuild, которые влияют на проект системы, использующие эти услуги. MSBuild 4.0 содержит новый компонент называется Менеджер сборки (не путать с Solution Build Manager, который является компонентом VS), который контролирует подача запросов на сборку. Это стало необходимым, поскольку Visual Studio 2010 теперь позволяет выполнять параллельные сборки (в частности, собственные проекты) и доступ к общим ресурсам, таким как ЦП, должен быть опосредован. За проектные системы, которые ранее просто назывались Project.Build () для Для вызова сборки необходимо внести несколько изменений. Система проектов сейчас должен:

  1. Запросить службу SVsBuildManagerAccessor с использованием интерфейса IServiceProvider. Это должно быть сделано вскоре после Система проекта загружена задолго до того, как может произойти сборка.
  2. Уведомить систему, если вам нужен поток пользовательского интерфейса
  3. Уведомить систему, если вы выполняете сборку во время разработки.
  4. Зарегистрируйте свои регистраторы, используя Build Manager Accessor.
  5. Отправляйте запросы на сборку непосредственно в диспетчер сборки MSBuild, а не вызывайте метод в Project.
0 голосов
/ 28 июня 2011

Конечно, вы можете использовать msbuild для создания любого файла решения Visual Studio.

Я считаю, что вы можете использовать Process.Start для вызова msbuild с соответствующими параметрами.

...