1

Mono.Cecil を使用してカスタム属性をメソッドに追加したいと考えています。カスタム属性のコンストラクターにはSystem.Type. Mono.Cecil を使用してそのようなカスタム属性を作成する方法と、System.Type パラメーターの引数は何かを理解しようとしています。

私の属性は次のように定義されています。

public class SampleAttribute : Attribute {
    public SampleAttribute (Type type) {}
}

これまでのところ、私は試しました:

var module = ...;
var method = ...;
var sampleAttributeCtor = ...;

var attribute = new CustomAttribute (sampleAttributeCtor);

attribute.ConstructorArguments.Add (
    new ConstructorArgument (module.TypeSystem.String, module.GetType ("TestType").FullName));

しかし、うまくいかないようです。何か案が?

次のようにコードを更新しました

var module=targetExe.MainModule;
            var anothermodule=sampleDll.MainModule;
            var custatt = new CustomAttribute(ctorReference);


            var corlib =module .AssemblyResolver.Resolve((AssemblyNameReference)module.TypeSystem.Corlib);
            var systemTypeRef = module.Import(corlib.MainModule .GetType("System.Type"));
            custatt.ConstructorArguments.Add(new CustomAttributeArgument(systemTypeRef, module.Import(anothermodule.GetType("SampleDll.Annotation"))));
            methodDef.CustomAttributes.Add(custatt);

助言がありますか?

4

1 に答える 1

2

カスタム属性の型はフルネームを文字列として使用してエンコードされますが、Cecilはそれを抽象化します。

Mono.Cecilのタイプの表現は、TypeReference(またはTypeDefinitionタイプが同じモジュールからのものである場合はa)です。

あなたは単にそれを引数として渡す必要があります。System.Typeまず、カスタム属性引数の型として使用する型への参照を取得する必要があります。

var corlib = module.AssemblyResolver.Resolve ((AssemblyNameReference) module.TypeSystem.Corlib);
var systemTypeRef = module.Import (corlib.GetType ("System.Type"));

そして、引数として使用するタイプに応じて、次のように記述できます。

attribute.ConstructorArguments.Add (
    new ConstructorArgument (
        systemTypeRef,
        module.GetType ("TestType")));

または、関心のあるタイプが別のモジュールにある場合は、参照をインポートする必要があります。

attribute.ConstructorArguments.Add (
    new ConstructorArgument (
        systemTypeRef,
        module.Import (anotherModule.GetType ("TestType"))));
于 2012-10-17T10:29:05.800 に答える