1

我正在使用ICSharpCode.Decompiler.Ast.AstBuilder(由 SharpDevelop、NRefactory 和 ILSpy 在后台使用;也从那里获得灵感)从代码中使用 .NET 通用中间语言程序集构建抽象语法树。

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
var astBuilder = new AstBuilder(new DecompilerContext(assembly.MainModule));
astBuilder.AddAssembly(assembly);
// astBuilder.SyntaxTree ...

TypeReferenceExpression只要有行 like ,语法树就会包含s Math.Abs()TypeDeclaration当引用类型也存在于同一语法树中时,如何检索它?

我得到的最接近的是TypeReferenceExpression.Type.ToTypeReference().Resolve(),但编排起来非常繁重,而且我已经(我想)拥有语法树中的所有信息。我还尝试使用命名空间和标识符进行手动查找,但我想应该有更好的方法。

4

1 回答 1

3

您可以使用SyntaxTree.GetTypes()枚举所有反编译的类型。由于这相当繁重,我会建立一个引用到声明的查找,例如:

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
var astBuilder = new AstBuilder(new DecompilerContext(assembly.MainModule));

astBuilder.AddAssembly(assembly);

var ast = astBuilder.SyntaxTree;

var lookup = ast.GetTypes(true)
                .ToDictionary(d => (TypeReference)d.Annotation<TypeDefinition>());

然后,您可以从中获取TypeReferenceTypeReferenceExpression使用它在查找中查找类型的声明:

TypeReferenceExpression e = /* ... */;
TypeDeclaration declaration;

if (lookup.TryGetValue(e.Type.Annotation<TypeReference>(), out declaration))
    Console.WriteLine(declaration.GetText());  // do whatever
于 2015-03-25T15:25:05.710 回答