プログラムでC#ソリューションを構築するにはどうすればよいですか?
ソリューションのパスを渡して、出力メッセージを取得できる(またはソリューションをビルドする)ことができるはずです。 C#でこれを実現するにはどうすればよいですか?
これは、SVNからすべてを取得してビルドするときに、プロジェクトの単一のソリューションを構築しているためです。次に、ワンクリックですべてを展開します。
あなたのほとんどは外部コマンドを呼び出すことでそれを行う方法を提供していますが、そこにはisAPI、 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
.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;
// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";
Process.Start(pathToMsBuild + " " + pathToSolution);
試すことができます MSBuild APIを使用してMSBuildを制御します
.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>
次に、projファイルを引数として使用してmsbuild.exeを呼び出します。以下は、バッチファイルの例です。 C#から、他のポスターに示されているようにProcess.Startを呼び出すことができます。
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" BuildSolutions.proj
pause
Visual Studioの拡張コードからビルドを実行する必要がある場合は、IVsBuildManagerAccessorインターフェイスによって課される制限を考慮する必要があります- Managed Package Framework for Projects の新しいIVsBuildManagerAccessor.docxを含む一般的な注意事項を参照してください。フォークは github でも入手できます。
Visual Studio 2010とMSBuild 4.0では、ソリューションビルドマネージャーとMSBuildの間に新しい相互作用があり、これらのサービスを利用するプロジェクトシステムに影響を与えます。 MSBuild 4.0には、ビルドリクエストの送信を制御するビルドマネージャー(VSコンポーネントであるソリューションビルドマネージャーと混同しないでください)と呼ばれる新しいコンポーネントが含まれています。これは、Visual Studio 2010が並列ビルド(特にネイティブプロジェクト)の発生と、CPUなどの共有リソースへのアクセスを仲介する必要があるために必要になりました。以前はProject.Build()を呼び出してビルドを呼び出すプロジェクトシステムでは、いくつかの変更を行う必要があります。プロジェクトシステムは次のことを行う必要があります。
- IServiceProviderインターフェイスを使用してSVsBuildManagerAccessorサービスを要求します。これは、プロジェクトシステムが読み込まれた直後、ビルドが発生する前に実行する必要があります。
- UIスレッドが必要な場合はシステムに通知する
- 設計時ビルドを行う場合は、システムに通知してください。
- Build Manager Accessorを使用してロガーを登録します。
- プロジェクトでメソッドを呼び出すのではなく、MSBuildビルドマネージャーにビルドリクエストを直接送信します。
確かに、msbuildを使用して任意のVisual Studioソリューションファイルをビルドできます。
Process.Start
は、適切なパラメーターでmsbuildを呼び出します。