如何在 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);
没有源代码
没有源代码怎么办?
- 如何在没有源代码而只有 DLL 的情况下获得
CSharpCompilation
?
- 如何枚举 DLL 中的所有符号并检索有关这些类型的所有信息?
罗斯林能做到吗?
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
工作
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 中的所有符号并检索有关这些类型的所有信息?
罗斯林能做到吗?
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
工作