大きなプロジェクトのソースコードを動的にコンパイルする必要があり、出力タイプはWindowsアプリケーションまたはクラスライブラリにすることができます。 コードがうまく実行され、.dllや.exeファイルを作成することは可能ですが、問題は、.exeファイルを作成しようとすると、プロジェクトアイコンのようなリソースが失われてしまうことです。結果ファイルにはアセンブリ情報が含まれていません。動的にコンパイルされたプロジェクトのリソースが失われる
これを解決する方法はありますか? (期待される結果は、Visual Studio 2015のプロジェクトファイルの手動ビルド機能と同じにする必要があります)。 ありがとうございました!
var workspace = MSBuildWorkspace.Create();
//Locating project file that is WindowsApplication
var project = workspace.OpenProjectAsync(@"C:\RoslynTestProjectExe\RoslynTestProjectExe.csproj").Result;
var metadataReferences = project.MetadataReferences;
// removing all references
foreach (var reference in metadataReferences)
{
project = project.RemoveMetadataReference(reference);
}
//getting new path of dlls location and adding them to project
var param = CreateParamString(); //my own function that returns list of references
foreach (var par in param)
{
project = project.AddMetadataReference(MetadataReference.CreateFromFile(par));
}
//compiling
var projectCompilation = project.GetCompilationAsync().Result;
using (var stream = new MemoryStream())
{
var result = projectCompilation.Emit(stream);
if (result.Success)
{
/// Getting result
//writing exe file
using (var file = File.Create(Path.Combine(_buildPath, fileName)))
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(file);
}
}
}
余分な作業をしなくても、コンパイル後に手動で組み込むことができます。詳細はhttps://github.com/dotnet/roslyn/issues/7791をご覧ください。 – JoshVarty