Как программно создать решение на C#?

Как создать решение C# программно?

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

Мне это нужно, потому что мы создаем единое решение для наших проектов, когда оно теперь получает все от SVN, а также строит его. Далее будет развертывание всего этого в один клик.


person Community    schedule 28.06.2011    source источник
comment
@Nix: я думаю, что OP означает компиляцию кода во время выполнения?   -  person Ry-♦    schedule 28.06.2011
comment
возможный дубликат Как программно построить решение визуальной студии?   -  person Bertrand Marron    schedule 28.06.2011


Ответы (6)


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

person Nix    schedule 28.06.2011
comment
похоже, что автоматическая компиляция проектов Visual Studio через С# с использованием ссылки MSBuild не работает - person ; 20.12.2012
comment
Эта информация устарела — если вы используете класс Engine, вы получите это предупреждение: Этот класс устарел. Вместо этого используйте Microsoft.Build.Evaluation.ProjectCollection из сборки Microsoft.Build. Таким образом, приведенный ниже ответ с использованием Project и ProjectCollection является правильным ответом. - person crimbo; 23.07.2014
comment
Ссылка (фактически) не работает. Он перенаправляет на общую страницу, браузер .NET API. - person Peter Mortensen; 03.01.2020
comment
О каком сообщении в блоге идет речь? Какова его связь? (Ответьте, изменив свой ответ, а не здесь, в комментариях (при необходимости).) - person Peter Mortensen; 03.01.2020

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

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;
person W1M0R    schedule 23.05.2012

Вы можете создать файл .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, используя файл проекта в качестве аргумента. Ниже приведен пример пакетного файла. Из С# вы можете вызвать Process.Start, как указано другими плакатами.

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

pause
person Jon Raynor    schedule 28.06.2011

Вы можете попробовать сообщение в блоге Управляйте MSBuild с помощью MSBuild API.

person Ram    schedule 22.07.2013

Если вам нужно инициировать сборку из кода расширения Visual Studio, вы должны учитывать ограничения, накладываемые интерфейсом IVsBuildManagerAccessor — см. Общие примечания, включая новый IVsBuildManagerAccessor.docx из Управляемая структура пакетов для проектов. Его ответвление также доступно на GitHub< /а>.

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

  1. Запросите службу SVsBuildManagerAccessor, используя интерфейс IServiceProvider. Это следует сделать вскоре после загрузки системы проекта, задолго до того, как могут начаться какие-либо сборки.
  2. Сообщите системе, если вам нужен поток пользовательского интерфейса
  3. Сообщите системе, если вы выполняете сборку во время разработки.
  4. Зарегистрируйте его регистраторы с помощью средства доступа Build Manager.
  5. Отправляйте запросы на сборку непосредственно в диспетчер сборки MSBuild, а не вызывая метод в проекте.
person Mikhail Filimonov    schedule 10.06.2015

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

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

person Davide Piras    schedule 28.06.2011