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

How to browse an assembly's content without source code in 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);

没有源代码

没有源代码怎么办?

罗斯林能做到吗?

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

要检查程序集,您需要使用 reflection

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);
    }
}

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

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

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

免责声明:我为 NDepend

工作