Reflection.Emitアセンブリにカスタム属性が正しく追加されていません

アンダーソン氏

を使用して動的アセンブリをRelection.Emit作成する際に、メソッドを作成し、それをで装飾しようとしていますSystem.Runtime.CompilerServices.MethodImplAttributeメソッドを使用してアセンブリを正常に作成および保存しましたが、保存したアセンブリをロードすると、メソッドにカスタム属性がないようです。アセンブリを作成するコードは次のとおりです。

ConstructorInfo methodImplCtor = typeof(System.Runtime.CompilerServices.MethodImplAttribute).GetConstructor(new[] { typeof(System.Runtime.CompilerServices.MethodImplOptions) });
// stores the constructor I wish to use

AssemblyBuilder assm = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.Save);
ModuleBuilder module = assm.DefineDynamicModule("MyAssembly", "MyAssembly.dll", false);
TypeBuilder type = module.DefineType("MyAssembly.MyType", TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed);
MethodBuilder method = type.DefineMethod("MyMethod", MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig, typeof(int), new[] { typeof(int) });

method.SetCustomAttribute(new CustomAttributeBuilder(methodImplCtor, new object[] { System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining }));

ILGenerator il = method.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ret);

type.CreateType();
assm.Save("MyAssembly.dll");

上記のコードを実行した後、MyAssembly.dllファイルを取得し、別のプロジェクトで参照します。このコードを実行すると、メソッドにカスタム属性がないことが報告されます。

var attributes = typeof(MyAssembly.MyType).GetMethod("MyMethod").GetCustomAttributes(false);
// empty array!
マーク・グラヴェル

これは、一部の属性は実際には属性ではなく、実際にはILプリミティブであるためです。これは、、[Serializable]および他のいくつかに適用されます-(明らかに)これを含みます。これが「ildasm」のILです。

.method public hidebysig static int32  MyMethod(int32 A_0) cil managed aggressiveinlining
{
  // Code size       2 (0x2)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  ret
} // end of method MyType::MyMethod

に注意してくださいaggressiveinlining

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Reflection.Emitを使用してアセンブリランタイムを作成します。mvc5で

分類Dev

属性コンストラクター(Reflection.Emit)を使用せずにプロパティに動的に追加された属性に値を追加する方法

分類Dev

System.Reflection.TargetInvocationExceptionがキャッチされていません

分類Dev

新しいインスタンスでC#Reflection Emit Func

分類Dev

Reflectionを使用してランタイムキャッシュにアクセスできない

分類Dev

動的タイプのシャドウ基本クラスのプロパティであり、Reflection.Emitを使用して保護に設定されています

分類Dev

Reflection.Emitを使用して、既存のクラスプロパティに新しい属性をプログラムで追加する

分類Dev

System.Reflection.Assemblyには、「GetExecutingAssembly」の定義が含まれていません

分類Dev

System.Reflection.Emitカスタムプロパティは私のモックアップと同じようですが、InvalidProgramExceptionが発生します

分類Dev

アセンブリをロードし、Reflectionを使用してクラスを作成します

分類Dev

Reflection.Emitに相当するJava

分類Dev

Reflection.Emitを使用して、相互に参照するタイプを生成します

分類Dev

操作はサポートされていません-System.Reflection.Assembly.LoadFile()

分類Dev

クラスをロードできますが、Reflectionがクラスに表示されません

分類Dev

How can Reflection.Emit assign incompatible types?

分類Dev

Reflection .NETCoreがラムダ式を作成

分類Dev

Kotlin Generic Reflectionサブクラス

分類Dev

更新後のSystem.Reflection複数アセンブリエラー

分類Dev

Reflection.EmitはBadImageFormatExceptionをスローします

分類Dev

Reflectionを使用して正しい正しいセッターメソッドを動的に呼び出す

分類Dev

Tableviewcellにはカスタムビューがあり、アプリの実行中にサイズが正しく設定されていません(下の写真)

分類Dev

なぜReflectionが必要なのですか?

分類Dev

getClass()がjava.lang.Classを返す[Reflection]

分類Dev

Java Reflectionは悪い習慣ですか?

分類Dev

「タイプ 'System.Reflection.RuntimeModule'のオブジェクトのシリアル化中に循環参照が検出されました」

分類Dev

ASP.Net WebFormsAjaxタイプ 'System.Reflection.Module'のオブジェクトのシリアル化中に循環参照が検出されました

分類Dev

Reflection.Emit / Sigilを使用したコンストラクターチェーン

分類Dev

Reflectionは.NetCoreでサポートされていますか?

分類Dev

難読化されたDLLがReflectionを介してロードされない

Related 関連記事

  1. 1

    Reflection.Emitを使用してアセンブリランタイムを作成します。mvc5で

  2. 2

    属性コンストラクター(Reflection.Emit)を使用せずにプロパティに動的に追加された属性に値を追加する方法

  3. 3

    System.Reflection.TargetInvocationExceptionがキャッチされていません

  4. 4

    新しいインスタンスでC#Reflection Emit Func

  5. 5

    Reflectionを使用してランタイムキャッシュにアクセスできない

  6. 6

    動的タイプのシャドウ基本クラスのプロパティであり、Reflection.Emitを使用して保護に設定されています

  7. 7

    Reflection.Emitを使用して、既存のクラスプロパティに新しい属性をプログラムで追加する

  8. 8

    System.Reflection.Assemblyには、「GetExecutingAssembly」の定義が含まれていません

  9. 9

    System.Reflection.Emitカスタムプロパティは私のモックアップと同じようですが、InvalidProgramExceptionが発生します

  10. 10

    アセンブリをロードし、Reflectionを使用してクラスを作成します

  11. 11

    Reflection.Emitに相当するJava

  12. 12

    Reflection.Emitを使用して、相互に参照するタイプを生成します

  13. 13

    操作はサポートされていません-System.Reflection.Assembly.LoadFile()

  14. 14

    クラスをロードできますが、Reflectionがクラスに表示されません

  15. 15

    How can Reflection.Emit assign incompatible types?

  16. 16

    Reflection .NETCoreがラムダ式を作成

  17. 17

    Kotlin Generic Reflectionサブクラス

  18. 18

    更新後のSystem.Reflection複数アセンブリエラー

  19. 19

    Reflection.EmitはBadImageFormatExceptionをスローします

  20. 20

    Reflectionを使用して正しい正しいセッターメソッドを動的に呼び出す

  21. 21

    Tableviewcellにはカスタムビューがあり、アプリの実行中にサイズが正しく設定されていません(下の写真)

  22. 22

    なぜReflectionが必要なのですか?

  23. 23

    getClass()がjava.lang.Classを返す[Reflection]

  24. 24

    Java Reflectionは悪い習慣ですか?

  25. 25

    「タイプ 'System.Reflection.RuntimeModule'のオブジェクトのシリアル化中に循環参照が検出されました」

  26. 26

    ASP.Net WebFormsAjaxタイプ 'System.Reflection.Module'のオブジェクトのシリアル化中に循環参照が検出されました

  27. 27

    Reflection.Emit / Sigilを使用したコンストラクターチェーン

  28. 28

    Reflectionは.NetCoreでサポートされていますか?

  29. 29

    難読化されたDLLがReflectionを介してロードされない

ホットタグ

アーカイブ