2016-09-09 11 views
2

大きなプロジェクトのソースコードを動的にコンパイルする必要があり、出力タイプは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); 
    } 
    } 
} 
+0

余分な作業をしなくても、コンパイル後に手動で組み込むことができます。詳細はhttps://github.com/dotnet/roslyn/issues/7791をご覧ください。 – JoshVarty

答えて

2

このように発行する必要があるすべての情報を含むようにワークスペースAPIを設計したことはありません。特にEmitを呼び出すときには、とりわけリソース情報を含むEmitOptionsを渡すことができます。しかし、このシナリオはあまり考慮されていなかったので、私たちはその情報を公開しません。我々はdone some of the work in the past to enable thisを持っていましたが、最終的にそれをマージしませんでした。バグを提出することを検討して、正式にリクエストをどこかに置くこともできます。

あなたは何をすることができますか?私はいくつかの選択肢があると思う。 はRoslynをまったく使用せず、プロジェクトファイルを変更してMSBuild APIを使用して構築することを検討してください。残念ながら、ここで最終的に達成しようとしていることはわかりませんが(あなたが言及した場合は助けになります)、プロジェクトの作成に関係するコンパイラの呼び出しだけではありません。参照を変更すると他のものも変更される可能性があります。

もちろん、MSBuildWorkspaceを自分で更新してこれを通過させることもできます。 Roslynコードを修正する場合は、implement a series of interfaces named "ICscHostObject#" (where # is a number) and we get passed the information from MSBuild to thatと表示されます。これはコマンドラインの引数ですでに隠しているようですので、コマンドラインの引数に渡して、必要なデータを取得することができます。

+0

ありがとうございます! – Bondjara

関連する問題