如何在Roslyn中没有源代码的情况下浏览程序集的内容

时间:2017-03-23 06:10:55

标签: c# .net code-analysis roslyn

Roslyn允许您从源代码中获取CSharpCompilation

// Getting the AST node
 var tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText("my code");

// Loading the semantic model
CSharpCompilation compilation = CSharpCompilation.Create("Compilation", new[] { tree });

然后我得到SemanticModel

var sm = compilation.GetSemanticModel(tree);

我通常会尝试这样的符号:

sm.GetSymbolInfo(node);

没有源代码

如果我没有源代码怎么办?

  • 如何在没有源代码但只有DLL的情况下获得CSharpCompilation
  • 如何枚举DLL中的所有符号并检索有关这些类型的所有信息?

罗斯林是否有能力做到这一点?

3 个答案:

答案 0 :(得分:7)

Roslyn不适合读取程序集,反射库如System.Reflection,Mono.Cecil,System.Reflection.Metadata或IKVM.Reflection可能更适合它。

话虽如此,如果你真的想这样做,你可以通过创建引用程序集然后使用GetAssemblyOrModuleSymbol的虚拟编译来获得程序集的符号。例如,要将程序集中的所有类型写入控制台,可以使用以下代码:

var reference = MetadataReference.CreateFromFile(dllPath);
var compilation = CSharpCompilation.Create(null).AddReferences(reference);

var assemblySymbol = (IAssemblySymbol)compilation.GetAssemblyOrModuleSymbol(reference);

Write(assemblySymbol.GlobalNamespace);

void Write(INamespaceOrTypeSymbol symbol)
{
    if (symbol is ITypeSymbol)
        Console.WriteLine(symbol);

    foreach (var memberSymbol in symbol.GetMembers().OfType<INamespaceOrTypeSymbol>())
    {
        Write(memberSymbol);
    }
}

答案 1 :(得分:1)

Roslyn是一个编译器。它需要源代码并生成程序集。

要检查装配,您需要使用reflection

答案 2 :(得分:1)

NDepend工具提供了一个代码模型,只能从程序集构建。不需要PDB或源代码,但如果PDB和源代码可用,则可以提供更多信息。有关NDepend分析输入here的更多解释。

然后可以通过C# LINQ queries探索代码模型。大约150 predefined code rules是用这种预定义的LINQ查询编写的。

构建的代码模型提出many facilities:代码度量,依赖关系,自基线以来的差异,状态可变性,技术债务估计......

免责声明:我为NDepend工作