使用mono.cecil添加自定义属性?

时间:2011-12-05 16:08:15

标签: c# mono.cecil

我无法想象如何使用Mono.Cecil将自定义属性添加到方法中 我想要添加的属性是这样的:

.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) 

有谁知道如何添加自定义属性

3 个答案:

答案 0 :(得分:14)

实际上很容易。

ModuleDefinition module = ...;
MethodDefinition targetMethod = ...;
MethodReference attributeConstructor = module.Import(
    typeof(DebuggerHiddenAttribute).GetConstructor(Type.EmptyTypes));

targetMethod.CustomAttributes.Add(new CustomAttribute(attributeConstructor));
module.Write(...);

答案 1 :(得分:4)

这是我的看法,

MethodDefinition methodDefinition = ...;
var module = methodDefinition.DeclaringType.Module;
var attr = module.Import(typeof (System.Diagnostics.DebuggerHiddenAttribute));

var attrConstructor = attr.Resolve().Constructors.GetConstructor(false, new Type[] {});
methodDefinition.CustomAttributes.Add(new CustomAttribute(attrConstructor));

我注意到Jb Evain的片段略有不同。我不确定这是因为他使用的是较新版本的Cecil还是因为我错了:)

在我的Cecil版本中,Import返回TypeReference,而不是构造函数。

答案 2 :(得分:0)

我想详细说明Jb Evain的答案,有关如何将参数传递给属性。对于示例,我使用了System.ComponentModel.BrowsableAttribute并将browsable参数的参数传递给其构造函数:

void AddBrowsableAttribute(
    ModuleDefinition module,
    Mono.Cecil.ICustomAttributeProvider targetMember, // Can be a PropertyDefinition, MethodDefinition or other member definitions
    bool browsable)
{
    // Your attribute type
    var attribType = typeof(System.ComponentModel.BrowsableAttribute);
    // Find your required constructor. This one has one boolean parameter.
    var constructor = attribType.GetConstructors()[0];
    var constructorRef = module.ImportReference(constructor);
    var attrib = new CustomAttribute(constructorRef);
    // The argument
    var browsableArg =
        new CustomAttributeArgument(
            module.ImportReference(typeof(bool)),
            browsable);
        attrib.ConstructorArguments.Add(browsableArg);
    targetMember.CustomAttributes.Add(attrib);
}

此外,可以将命名参数添加到创建的Properties的{​​{1}}集合中。