2016-09-09 4 views
0

Roslyn DiagnosticAnalyzerのC#ソースコードを解析すると、ITypeSymbolがあります。この型がソースで宣言されるのか、アセンブリ参照によってのみ参照されるのかをどうやって判断できますか?シンボルがソリューション内で宣言されているかどうかを知る方法?

私の現在の解決策は、シンボルにDeclaringSyntaxReferencesがあるかどうかをチェックすることです。これはVisual Studio内でうまく動作します。しかし、私がMsBuildの実行で分析を行っているとき、私の結果は正確ではありません。問題は、MsBuildが各プロジェクトを1つずつビルドするため、タイプシンボルが別のプロジェクトで宣言されている場合、DeclaringSyntaxReferencesは空になります。

「プロジェクト参照」と「アセンブリ参照」を区別する方法はありますか?

+0

http://stackoverflow.com/questions/39200779/using-roslyn-how-to-check-if-class-comes-from-a-local-project -not-the-bcl-or-n/39202311#39202311 – m0sa

+0

@ m0saありがとう、これは私の質問には答えません。私はこれがVSIXでこれを行う方法だと知っていますが、これはプロジェクト全体でnugetとmsbuildでは動作しません。 – Tamas

+0

これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のインスタンスのように感じます。あなたがそのような区別を知っていたら何をしようとしていますか? –

答えて

-1

希望は、この方法は役立ちます:

private bool GetSource(ISymbol symbol, out string filePath) 
{ 
    var baseLocation = symbol.Locations.FirstOrDefault(); 
    filePath = "SPECIFY CURRENT SYNTAX TREE FILE PATH"; 

    if (baseLocation == null) 
     return false; 

    var baseLocationPath = baseLocation.ToString(); 

    if (baseLocationPath.Contains("SourceFile(")) 
    { 
     baseLocationPath = baseLocation.ToString().Replace("SourceFile(", ""); 
     filePath = baseLocationPath.Substring(0, baseLocationPath.LastIndexOf("[", StringComparison.Ordinal)); 
    } 
    else if (baseLocationPath.Contains("MetadataFile(")) 
    { 
     baseLocationPath = baseLocation.ToString().Replace("MetadataFile(", ""); 
     filePath = baseLocationPath.Substring(0, baseLocationPath.LastIndexOf(".dll", StringComparison.Ordinal) + 4); 
    } 

    return baseLocation.IsInSource; 
} 
+0

'IsInSource'プロパティは、その場所のシンタックスツリーがあるかどうかだけをチェックします。 msbuildを実行している場合は、プロジェクト間では何もありません。 – Tamas

関連する問題