2017-08-02 3 views
1

私は、いくつかのメソッドに関する情報を得るために、roslyn構文ツリーを使用してアナライザーを作成しようとしていました。問題は次のとおりです。私が書いているアナライザーは、分析したいソリューションと同じソリューションにする必要があります。 だから、これは私のコードです:スタンドアロンコードアナライザーが書き込まれているソリューションをロードする

using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 

public static class Main 
{ 

    public static Solution solution { get; set; } = null; 

    public static string GetMethodInfo(string methodToFind) 
    { 

     Task<Solution> GetSolutionTask = null; 
     string namespaceToFind, classToFind, methodToFind, invocationToFind; 
     if (solution == null) 
     { 
      var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create(); 
      GetSolutionTask = workspace.OpenSolutionAsync(Config.SolutionPath); 
     } 
     if (GetSolutionTask != null) solution = GetSolutionTask.Result; 
     foreach (Project proj in solution.Projects) 
     { 
      Compilation compilation = proj.GetCompilationAsync().Result; 
      foreach (var tree in compilation.SyntaxTrees) 
      { 
       findMethodAndProcessIt()... 
      } 
     } 
     return String.Empty; 
    } 
} 

私が手の問題は何もコンパイルが任意の構文木を持っていないということです。私は他のソリューションを開いてこの同じコードを試して、それは動作します。ここでの問題は、ビジュアルスタジオが使用しているソリューションを開こうとすることです。 私は既にVisual Studioを閉じた状態でこのコードを実行しようとしましたが、.exeを実行していても問題は解決しません。 これを解決する方法はありますか?

+0

あなたのプロジェクトは何ですか? – SLaks

+0

私のプロジェクトの目的は、特定のメソッドの呼び出しに関する情報を抽出し、その情報を使ってjsonファイルを生成し、プロジェクトのドキュメンテーションWebポータルに表示できるようにすることです。 –

+0

'Config.SolutionPath'はどこから来たのですか?それは正しい値を持っていますか?ああ、ところで、何か*明らかに*問題があるときは、おそらくそうではありません。 –

答えて

0

MSBuildWorkspaceを使用してソリューションを開きます。通常、MSBuildWorkspaceを使用すると、正しくロードされていないプロジェクトが発生し、ソースファイルなどがない場合、msbuild処理中にエラーが発生しています。これは通常、アプリケーションがmsbuildが(msbuild.exe.config内で)使用するapp.configファイル内の同じバインディングリダイレクトを持たず、バージョンミスマッチのためにいくつかのカスタムタスク/拡張機能が読み込まれない場合に発生します。

<assemblyBinding>セクションをapp.configにコピーします。

+0

ありがとう、それは私のために働いた。 –

関連する問題