また、オンザフライで完全なソリューションをコンパイルしたいと考えました。 Kevin Pilch-Bisson's answerとJosh E's commentからビルドすると、自分自身をコンパイルしてファイルに書き込むコードを書いています。
ソフトウェア使用し
Visual Studioのコミュニティ2015 Update 1の
Microsoft.CodeAnalysisのv1.1.0.0(コマンドInstall-Package Microsoft.CodeAnalysis
とパッケージマネージャコンソールを使用してインストールされます)。
コード
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Emit;
using Microsoft.CodeAnalysis.MSBuild;
namespace Roslyn.TryItOut
{
class Program
{
static void Main(string[] args)
{
string solutionUrl = "C:\\Dev\\Roslyn.TryItOut\\Roslyn.TryItOut.sln";
string outputDir = "C:\\Dev\\Roslyn.TryItOut\\output";
if (!Directory.Exists(outputDir))
{
Directory.CreateDirectory(outputDir);
}
bool success = CompileSolution(solutionUrl, outputDir);
if (success)
{
Console.WriteLine("Compilation completed successfully.");
Console.WriteLine("Output directory:");
Console.WriteLine(outputDir);
}
else
{
Console.WriteLine("Compilation failed.");
}
Console.WriteLine("Press the any key to exit.");
Console.ReadKey();
}
private static bool CompileSolution(string solutionUrl, string outputDir)
{
bool success = true;
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution solution = workspace.OpenSolutionAsync(solutionUrl).Result;
ProjectDependencyGraph projectGraph = solution.GetProjectDependencyGraph();
Dictionary<string, Stream> assemblies = new Dictionary<string, Stream>();
foreach (ProjectId projectId in projectGraph.GetTopologicallySortedProjects())
{
Compilation projectCompilation = solution.GetProject(projectId).GetCompilationAsync().Result;
if (null != projectCompilation && !string.IsNullOrEmpty(projectCompilation.AssemblyName))
{
using (var stream = new MemoryStream())
{
EmitResult result = projectCompilation.Emit(stream);
if (result.Success)
{
string fileName = string.Format("{0}.dll", projectCompilation.AssemblyName);
using (FileStream file = File.Create(outputDir + '\\' + fileName))
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(file);
}
}
else
{
success = false;
}
}
}
else
{
success = false;
}
}
return success;
}
}
}
(sln.ProjectsInDependencyOrder' 'のように)依存順序を決定する便利な方法はありますか、これは私が自分で実装する必要があります何かありますか? (例えば、プロジェクト参照を経由して依存関係ツリーを構築する) – NobodysNightmare
GetTopologicallySortedProjects()を持つIProjectDependencyServiceがあります。私はそれを得る方法を正確に調べるのに便利なコンピュータを持っていませんが、後で更新します。 –
いくつかのコードを追加する答えを編集しました。 –