Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Большинство из вас предоставляют способы сделать это, вызывая внешние команды, но есть api, Microsoft.Build.Framework, чтобы построить через С#


Код из блога:

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

См. эту ссылку для примера с использованием .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.

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

программный запуск 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;

Ответ 3

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

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

Ответ 4

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

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

pause

Ответ 6

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

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

  • Запросить сервис SVsBuildManagerAccessor с помощью интерфейса IServiceProvider. Это должно быть сделано вскоре после система проекта загружается, задолго до того, как могут возникнуть какие-либо сборки.
  • Сообщите системе, если вам нужен поток пользовательского интерфейса.
  • Уведомлять систему, если вы выполняете сборку времени разработки.
  • Зарегистрируйте свои регистраторы, используя Access Manager Access Manager.
  • Отправить запросы сборки непосредственно в MSBuild Build Manager, а не ссылаться на метод в проекте.

Ответ 7

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

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