繁体   English   中英

使用Roslyn检测外部API调用

[英]Detect external api calls using roslyn

我想知道如何检测例如InvocationExpressionSyntax是来自我的代码还是来自外部代码。

我试图找到方法,但没有成功。

例。:

public async Task MyMethodAsync1()
{
   await MyMethodAsync2(); // How to know that this 'InvocationExpressionSyntax' is mine using roslyn ?
}

public async Task MyMethodAsync2()
{
  await Task.Delay(1); // How to know that this 'InvocationExpressionSyntax' is NOT mine using roslyn ?
}

谢谢

为了更好地实现,你可以检查DeclaringSyntaxReferences从接收ISymbol你的下InvocationExpressionSyntax是空的。 更清楚地说,您还可以通过检查IsImplicitlyDeclared为false来确保该符号不是由编译器生成的

  public static bool IsDeclareInMetadata(this SemanticModel semanticModel, SyntaxNode node)
  {
    var info = semanticModel.GetSymbolInfo(node);
    return !(info.Symbol is null) && info.Symbol.DeclaringSyntaxReferences.IsDefaultOrEmpty && !info.Symbol.IsImplicitlyDeclared;
  }

您需要定义当说“我的代码”或“外部代码”时的含义。

假设“我的代码”表示“已编译到当前程序集中的代码”,而外部代码表示“来自引用程序集的代码”,这是找出与程序集进行比较的最简单方法。

假设您具有一个SyntaxNodeAnalysisContext context和一个InvocationExpressionSyntax node ,则可以找到要调用的方法的符号,如下所示:

var symbol = context.SemanticModel.GetSymbolInfo(node, context.Cancellationtoken);

请记住,该符号可能为空,因此请进行测试。

您现在可以比较程序集:

bool fromSameAssembly = context.Compilation.Assembly.Equals(symbol.ContainingAssembly);

另一种选择是查看符号的位置:

bool isInMetadata = symbol.Locations.Any(loc => loc.IsInMetadata);
bool isInSource = symbol.Locations.Any(loc => loc.IsInSource);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM