2017-03-11 11 views
1

私はRoslynを使用して、MsBuildWorkspaceを使用していくつかのプロジェクトでC#ソリューションをコンパイルしています。Roslyn MSBuildWorkspaceを使用してC#プロジェクトの 'obj'ディレクトリを見つける方法は?

Projectの出力ファイルを見つけるのは簡単です。そのためにはOutputFilePathプロパティを使用することができます。

しかし、私は(一般的にこれは「objのディレクトリですが、これはcsprojファイルでMSBuildのプロパティBaseIntermediateOutputPathIntermediateOutputPathを使用して変更することができます)「中間」ディレクトリを把握する方法を見つけることができません。

これを行う方法を知っている人はいますか?

+0

あなたはそれを見つける必要があるのはなぜ? – svick

+0

申し訳ありませんが、私はより具体的であったはずです。プログラムの実行中に修正コードを再コンパイルする(「AppDomainを使用してすべてのアセンブリをロード/アンロードする)」という「ホットコードリローダ」を作成しています。しかし、Visual Studio/MSBuildは中間の 'obj'フォルダにC#ファイルを生成することがよくあります。たとえば、 'UserControl.xaml.cs'ファイルの場合、別のファイル' UserControl.g.cs'が生成されます。私はRoslynがこれらのファイルを生成することはできないと思うので、私の現在の方法は、これらの生成されたファイルを新しいRoslynの 'Project'に追加することです。これはハックですが、動作します(MVVMと緩やかなXAMLを使用しているので、これらのファイルはいくつかしかありません) – Ziriax

答えて

3

あなたはMicrosoft.Build.dllからMicrosoft.Build.Evaluation.Projectを使用して、プロジェクトのプロパティを持ってすることができます

void foo(String projectPath, IDictionary<String, String> globalProperties, String toolsVersion) 
{ 
    Project project = new Project(projectPath, globalProperties, toolsVersion); 
    String baseIntermediateOutputPath = GetProjectProperty(project, "BaseIntermediateOutputPath"); 
    String intermediateOutputPath = GetProjectProperty(project, "IntermediateOutputPath"); 
    // .... 
} 

static String GetProjectProperty(Microsoft.Build.Evaluation.Project project, String propertyName) 
{ 
    return project.Properties 
        .FirstOrDefault(prop => String.Equals(prop.Name, propertyName, StringComparison.OrdinalIgnoreCase)) 
       ?.EvaluatedValue; 
} 
関連する問題