【问题标题】:Mono.Cecil metadata token updateMono.Cecil 元数据令牌更新
【发布时间】:2020-05-01 01:46:38
【问题描述】:

目前我正在研究一种 .NET 程序集保护器/修补程序。

问题是,在某种动态代码注入(通过 MethodBody.ILProcessor.Emit() 系列例程执行)之后,新添加的类型、方法和其他工件,取自已编译的模板程序集,将被放置在目标程序集中。因此,注入后,目标程序集被修改,没有对模板程序集的引用。在此类操作(类型、方法等复制)之后,注入工件(类型、方法等)的元数据标记无效(即,模板程序集中的所有 MethodDefinition-s 在被复制到目标程序集,接收元数据标记,对应于 RID == 0 的 MethodDefinition-s)。但是尝试保存目标程序集没有任何效果,因为它已被使用,因此尽管目标程序集加载为:
AssemblyDefinition target = AssemblyDefinition.ReadAssembly(path, new ReaderParameters(ReadingMode.Immediate));

所以,我的问题是:有没有办法(在 Mono.Cecil 中)使所有元数据令牌分层更新(即接收 RID != 0 的 RID),而无需实际写入文件?或者至少手动分配/分发元数据令牌?

附:提前致谢!

【问题讨论】:

    标签: c# .net clr cil mono.cecil


    【解决方案1】:

    基本上我找不到这种可能性。当我使用 Mono.Cecil 库时,这一切都发生在某种代码操作之后,一些以前引用的类(在我的特定情况下是 System.UInt64)从“测试”程序集中消失了(因为 Mono.Cecil 删除了未使用的引用,并且我没有正确使用它)。好吧,重点是,在保存已编辑的程序集时,Mono.Cecil 会删除未使用的引用,因此一旦保存了程序集并希望稍后对其进行变异(例如,在执行期间),就不要依赖过时的引用.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2022-11-07
      • 2016-12-19
      • 2014-09-13
      • 2020-09-21
      • 2017-04-14
      相关资源
      最近更新 更多