以编程方式从现有程序集中删除自定义属性

3
我正在使用System.Reflection.Emit创建一个新程序集A,该程序集调用现有程序集B中的方法。
B中的方法带有一些自定义属性,我想通过编程方式删除它们。我无法访问生成B的源代码。
我在.NET框架中找不到文档化的方法来完成这个任务。有什么建议吗?
非常感谢!

1
“通过‘移除它们’,我理解你的意思是‘生成一个元数据和IL与目标程序集相同的程序集,但不包括那些我认为不喜欢的属性,然后可能替换目标程序集’?这当然可以做到(只需反汇编、删除属性并重新汇编),但前提是该程序集没有使用强名称进行签名。” - dlev
是的,那正是我想要的,而我的程序集没有强名称。我能否使用.NET框架库以编程方式反汇编程序集? - user1470622
你需要使用ildasm.exe反编译程序集,删除属性的IL代码,再使用ilasm.exe重新组装。虽然以编程方式实现这一过程不是完全不可能的,但也有点困难。 - Hans Passant
1
你可能想看一下Mono Cecil:http://www.mono-project.com/Cecil - dlev
3个回答

2
您可以查看PowerShellArsenal
它有一个用于删除SuppressIldasmAttribute的脚本。
我没有查看过它,但我猜测您可以使用用于删除任何属性的代码。

Remove-AssemblySuppressIldasmAttribute

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

它使用dnlib来移除属性。

2

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


4
将它们以编程方式移除就像尝试以编程方式删除方法或属性一样,这有什么过分之处?你听说过Mono Cecil吗? - Andrew Savinykh
“通过编程”我指的是在运行时更改类,然后在运行时使用修改后的类。Mono Cecil能做到这一点吗? - Kevin Aenmey

0

你可以使用Mono.Cecil编辑现有的程序集。

例如,要删除SuppressIldasmAttribute

public static void RemoveSuppressIldasmAttribute(string input, string output)
{
    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(input);

    foreach (CustomAttribute attribute in assembly.CustomAttributes)
    {
        if (attribute.Constructor.DeclaringType.Name == "SuppressIldasmAttribute")
        {
            assembly.CustomAttributes.Remove(attribute);
        }
    }

    assembly.Write(output);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接