为了账号安全,请及时绑定邮箱和手机立即绑定

使用 roslyn 检测外部 api 调用

使用 roslyn 检测外部 api 调用

C#
BIG阳 2022-12-24 10:11:13
我想知道如何检测例如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 ?}谢谢
查看完整描述

2 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

为了实现这一点,您可以检查您下DeclaringSyntaxReferences收到的来自是否为空。为了更清楚,您还可以通过检查是否为 false来确保此符号不是由编译器生成的ISymbolInvocationExpressionSyntaxIsImplicitlyDeclared


  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;

  }


查看完整回答
反对 回复 2022-12-24
?
狐的传说

TA贡献1804条经验 获得超3个赞

当你说“我的代码”或“外部代码”时,你需要定义你的意思。

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

假设您有一个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);


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号