【问题标题】:Programmatically remove custom attributes from existing assemblies以编程方式从现有程序集中删除自定义属性
【发布时间】:2012-06-20 22:45:13
【问题描述】:

我正在使用 System.Reflection.Emit 创建一个新的程序集 A,它从现有程序集 B 调用方法。

B 中的方法带有一些自定义属性的注释,我想以编程方式删除它们。我无权访问生成 B 的源代码。

我在 .NET 框架中找不到记录的方式来执行此操作。有什么指点吗?

非常感谢!

【问题讨论】:

  • 通过“删除它们”我假设您的意思是“生成一个其元数据和 IL 与目标程序集相同的程序集,除了那些我认为令人讨厌的属性,然后可能替换目标程序集”?这当然可以完成(只需反汇编、删除属性并重新组装),但前提是程序集没有使用强名称进行签名。
  • 是的,这正是我想要的,我的程序集没有一个强名称。我可以仅使用 .NET 框架库以编程方式反汇编程序集吗?
  • 您必须使用 ildasm.exe 反编译程序集,删除属性的 IL,然后将 humpty-dumpty 与 ilasm.exe 重新组合在一起。以编程方式执行此操作,呃,并非完全不可能。
  • 你可能想看看 Mono Cecil:mono-project.com/Cecil

标签: .net clr .net-assembly


【解决方案1】:

我不相信这是可能的。属性被编译成 IL。以编程方式删除它们就像尝试以编程方式删除方法或属性。

【讨论】:

  • “以编程方式删除它们就像尝试以编程方式删除方法或属性”,这有什么牵强的?听说过 Mono Cecil 吗?
  • “以编程方式”是指在运行时更改一个类,然后在运行时使用修改后的类。 Mono Cecil 能做到吗?
【解决方案2】:

您可以查看PowerShellArsenal
它有一个用于删除 SuppressIldasmAttribute 的脚本。

我还没有看过它,但我猜你可以使用用于删除任何属性的代码。

删除-AssemblySuppressIldasmAttribute

从 .NET 程序集中去除 SuppressIldasmAttribute 属性。

它使用dnlibremove 一个属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2021-10-19
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多