Jak zbudować rozwiązanie programowo w C#?

Jak programowo zbudować rozwiązanie C#? Powinienem być w stanie przejść ścieżkę rozwiązania i uzyskać komunikaty wyjściowe ( lub po prostu zbudować rozwiązanie ) jak to osiągnąć w C#?

Author: Cœur, 2011-06-28

7 answers

Większość z was zapewnia sposoby, aby to zrobić, wywołując zewnętrzne polecenia, ale jest API, Microsoft.Buduj.Framework , do budowania za pomocą C #


Kod Z Bloga:

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();
}

Zauważ, że kod na tym blogu działa, ale jest trochę przestarzały

Microsoft.Build.BuildEngine

Został podzielony na kilka kawałków

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

 19
Author: Nix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-22 18:22:57

Zobacz ten link, aby zobaczyć przykład korzystania z 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();
}

Prostszy przykład:

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

Pamiętaj, aby używać profilu. NET 4 (nie Profilu Klienta).

Dodaj następujące referencje: System.XML, Microsoft.Build, Microsoft.Buduj.Framework i opcjonalnie Microsoft.Buduj.Narzędzia.v4. 0.

Zobacz też:

Uruchamianie msbuild programowo

Aby zbudować rozwiązanie, wykonaj następujące czynności:

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;
 29
Author: W1M0R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48
// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";

Process.Start(pathToMsBuild + " " + pathToSolution);
 5
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-28 18:36:47

Możesz utworzyć .plik 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>

A następnie zadzwoń do msbuild.exe używając pliku proj jako argumentu, poniżej znajduje się przykład pliku wsadowego. Z C# można wywołać proces.Zacznij zgodnie z innymi plakatami.

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

pause
 2
Author: Jon Raynor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-28 18:47:27
 2
Author: Rama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 12:40:30

Jeśli potrzebujesz kompilacji z kodu rozszerzenia Visual Studio, musisz wziąć pod uwagę ograniczenia nałożone przez interfejs IVsBuildManagerAccessor-zobacz Uwagi ogólne, w tym nowy IVsBuildManagerAccessor.docx z Managed Package Framework for Projects . Widelec jest również dostępny na github.

W Visual Studio 2010 z MSBuild 4.0 pojawiają się nowe interakcje pomiędzy Solution Build Manager a MSBuild, które mają wpływ na projekt systemy korzystanie z tych usług. MSBuild 4.0 zawiera nowy komponent zwany menedżerem budowania (nie mylić z Solution Build Manager, który jest komponentem VS), który kontroluje składanie wniosków o budowę. Stało się to konieczne jako Visual Studio 2010 pozwala teraz na równoległe Kompilacje (zwłaszcza projekty natywne) i dostęp do współdzielonych zasobów, takich jak procesor, musiał być pośredniczony. Na systemy projektowe, które wcześniej nazywały się po prostu projektem.Build () to wywołaj build kilka zmiany muszą zostać wprowadzone. System projektowy teraz "must": {]}

  1. poproś o usługę SVsBuildManagerAccessor używając interfejsu IServiceProvider. Należy to zrobić wkrótce po system projektu jest ładowany, na długo przed ewentualnymi kompilacjami.
  2. powiadom system, jeśli potrzebujesz wątku UI
  3. powiadom system, jeśli robisz projekt-czas budowania.
  4. Rejestruj jego loggery za pomocą Accessora Build Managera.
  5. Prześlij żądania budowania bezpośrednio do Menedżera kompilacji MSBuild, zamiast wywoływania metody w projekcie.
 1
Author: Mikhail Filimonov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 13:44:28

Z pewnością możesz użyć msbuild do zbudowania dowolnego pliku rozwiązania Visual Studio.

Wierzę, że możesz użyć Process.Start do wywołania msbuild z odpowiednimi parametrami.

 0
Author: Davide Piras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-28 18:36:46