C# 使用roslyn提取被调用的方法信息
我需要获得有关使用Roslyn调用DLL的方法的信息。例如,我有以下方法,其中dllObject是DLL文件的一部分C# 使用roslyn提取被调用的方法信息,c#,roslyn,C#,Roslyn,我需要获得有关使用Roslyn调用DLL的方法的信息。例如,我有以下方法,其中dllObject是DLL文件的一部分 public void MyMethod() { dllObject.GetMethod(); } 是否可以提取GetMethod的方法信息,例如它的名称、类名和程序集名称。是的,您需要首先在语法树中搜索InvocationExpressionSyntax,然后使用SemanticModel检索它的完整符号,该符号应包含关于其全名的信息。ToString,类。包
public void MyMethod()
{
dllObject.GetMethod();
}
是否可以提取GetMethod的方法信息,例如它的名称、类名和程序集名称。是的,您需要首先在语法树中搜索InvocationExpressionSyntax,然后使用SemanticModel检索它的完整符号,该符号应包含关于其全名的信息。ToString,类。包含类型和程序集。包含程序集 下面的示例是自包含的,因此它不使用外部DLL,但同样的方法也适用于外部类型
var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass {
int Method1() { return 0; }
void Method2()
{
int x = Method1();
}
}
}");
var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);
//Looking at the first invocation
var invocationSyntax = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var invokedSymbol = model.GetSymbolInfo(invocationSyntax).Symbol; //Same as MyClass.Method1
//Get name
var name = invokedSymbol.ToString();
//Get class
var parentClass = invokedSymbol.ContainingType;
//Get assembly
var assembly = invokedSymbol.ContainingAssembly;
几年前,我写了一篇关于提取调用方法的短文,你可能会觉得很有帮助。标题不应该是提取调用方法而不是提取调用方法吗?是的,你说得对,它已经更新了