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);
如果我没有源代码怎么办?
CSharpCompilation
?罗斯林是否有能力做到这一点?
答案 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工作