Как создать программное решение С#? Я должен был бы пройти путь решения и получить выходные сообщения (или просто построить решение), как я могу достичь этого в С#?
Как я могу создать решение программно на С#?
Ответ 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.
Также смотрите здесь:
Чтобы создать решение, сделайте следующее:
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
Ответ 5
Вы можете попробовать Возьмите под свой контроль MSBuild с помощью API MSBuild
Ответ 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 с соответствующими параметрами.