次の方法で共有


FieldBuilder.SetCustomAttribute メソッド (ConstructorInfo, Byte[])

指定されたカスタム属性 BLOB を使用して、カスタム属性を設定します。

Overloads Public Sub SetCustomAttribute( _
   ByVal con As ConstructorInfo, _   ByVal binaryAttribute() As Byte _)
[C#]
public void SetCustomAttribute(ConstructorInfocon,byte[] binaryAttribute);
[C++]
public: void SetCustomAttribute(ConstructorInfo* con,unsigned charbinaryAttribute __gc[]);
[JScript]
public function SetCustomAttribute(
   con : ConstructorInfo,binaryAttribute : Byte[]);

パラメータ

  • con
    カスタム属性用のコンストラクタ。
  • binaryAttribute
    属性を表すバイト BLOB。

例外

例外の種類 条件
ArgumentNullException con または binaryAttribute が null 参照 (Visual Basic では Nothing) です。
InvalidOperationException このフィールドの親の型が完全型です。

解説

binaryAttribute の書式設定方法については、ECMA Partition II のマニュアルのメタデータの仕様を参照してください。Partition II のマニュアルは .NET Framework SDK のインストールに含まれています。これは %\Microsoft.NET\FrameworkSDK\Tool Developers Guide\docs ディレクトリにあります。

使用例

[Visual Basic, C#, C++] FieldBuilder のコンテキストでバイト BLOB を使用する SetCustomAttribute の使用方法については、次のコード例を参照してください。

 
Imports System
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

Namespace MySample
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute1
      Inherits Attribute
      Public myCustomAttributeValue As String

      Public Sub New(ByVal myString As String)
         myCustomAttributeValue = myString
      End Sub 'New
   End Class 'MyAttribute1
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute2
      Inherits Attribute
      Public myCustomAttributeValue As Boolean

      Public Sub New(ByVal myBool As Boolean)
         myCustomAttributeValue = myBool
      End Sub 'New
   End Class 'MyAttribute2

   Class FieldBuilder_Sample

      Private Shared Function CreateCallee(ByVal currentDomain As AppDomain) As Type
         ' Create a simple name for the assembly.
         Dim myAssemblyName As New AssemblyName()
         myAssemblyName.Name = "EmittedAssembly"
         ' Create the called dynamic assembly.
         Dim myAssemblyBuilder As AssemblyBuilder = _
                     currentDomain.DefineDynamicAssembly(myAssemblyName, _
                     AssemblyBuilderAccess.RunAndSave)
         Dim myModuleBuilder As ModuleBuilder = _
               myAssemblyBuilder.DefineDynamicModule("EmittedModule", _
                                                   "EmittedModule.mod")
         ' Define a public class named 'CustomClass' in the assembly.
         Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("CustomClass", _
                                                TypeAttributes.Public)
         ' Define a private String field named 'MyField' in the type.
         Dim myFieldBuilder As FieldBuilder = myTypeBuilder.DefineField("MyField", _
                                       GetType(String), FieldAttributes.Public)
         Dim myAttributeType1 As Type = GetType(MyAttribute1)
         ' Create a Constructorinfo object for attribute 'MyAttribute1'.
         Dim myConstructorInfo As ConstructorInfo = _
                     myAttributeType1.GetConstructor(New Type(0) {GetType(String)})
         ' Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         Dim attributeBuilder As _
         New CustomAttributeBuilder(myConstructorInfo, New Object(0) {"Test"})
         ' Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder)

         Dim myAttributeType2 As Type = GetType(MyAttribute2)
         ' Create a Constructorinfo object for attribute 'MyAttribute2'.
         Dim myConstructorInfo2 As ConstructorInfo = _
                  myAttributeType2.GetConstructor(New Type(0) {GetType(Boolean)})
         ' Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2, New Byte() {1, 0, 1, 0, 0})

         ' Create a method.
         Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("MyMethod", _
               MethodAttributes.Public, Nothing, New Type(1) {GetType(String), GetType(Integer)})
         Dim myILGenerator As ILGenerator = myMethodBuilder.GetILGenerator()
         myILGenerator.Emit(OpCodes.Ldarg_0)
         myILGenerator.Emit(OpCodes.Ldarg_1)
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder)
         myILGenerator.EmitWriteLine("Value of the Field is :")
         myILGenerator.EmitWriteLine(myFieldBuilder)
         myILGenerator.Emit(OpCodes.Ret)

         Return myTypeBuilder.CreateType()
      End Function 'CreateCallee

      Public Shared Sub Main()
         Try
            Dim myCustomClass As Type = CreateCallee(Thread.GetDomain())
            ' Construct an instance of a type.
            Dim myObject As Object = Activator.CreateInstance(myCustomClass)
            Console.WriteLine("FieldBuilder Sample")
            ' Find a method in this type and call it on this object.
            Dim myMethodInfo As MethodInfo = myCustomClass.GetMethod("MyMethod")
            myMethodInfo.Invoke(myObject, New Object(1) {"Sample string", 3})
            ' Retrieve the values of Attributes applied to field and display to console.
            Dim myFieldInfo As FieldInfo() = myCustomClass.GetFields()
            Dim i As Integer
            For i = 0 To myFieldInfo.Length - 1
               Dim attributes As Object() = myFieldInfo(i).GetCustomAttributes(True)
               Dim index As Integer
               For index = 0 To attributes.Length - 1
                  If TypeOf attributes(index) Is MyAttribute1 Then
                     Dim myCustomAttribute As MyAttribute1 =  _
                                    CType(attributes(index), MyAttribute1)
                     Console.WriteLine("Attribute Value of (MyAttribute1): " _
                                    + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
                  If TypeOf attributes(index) Is MyAttribute2 Then
                     Dim myCustomAttribute As MyAttribute2 = _
                                    CType(attributes(index), MyAttribute2)
                     Console.WriteLine("Attribute Value of (MyAttribute2): " _
                                       + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
               Next index
            Next i
         Catch e as Exception
            Console.WriteLine("Exception Caught "+e.Message)
         End Try
      End Sub 'Main
   End Class 'FieldBuilder_Sample
End Namespace 'MySample

[C#] 

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;

namespace MySample
{
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute1 :Attribute
   {
      public string myCustomAttributeValue;
      public MyAttribute1(string myString)
      {
         myCustomAttributeValue = myString;

      }
   }
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute2 :Attribute
   {
      public bool myCustomAttributeValue;
      public MyAttribute2(bool myBool)
      {
         myCustomAttributeValue = myBool;

      }
   }

   class FieldBuilder_Sample
   {
      private static Type CreateCallee(AppDomain currentDomain)
      {

         // Create a simple name for the assembly.
         AssemblyName myAssemblyName = new AssemblyName();
         myAssemblyName.Name = "EmittedAssembly";
         // Create the called dynamic assembly.
         AssemblyBuilder myAssemblyBuilder =
            currentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);
         ModuleBuilder myModuleBuilder =
                  myAssemblyBuilder.DefineDynamicModule("EmittedModule","EmittedModule.mod");
         // Define a public class named 'CustomClass' in the assembly.
         TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("CustomClass",
            TypeAttributes.Public);
         // Define a private String field named 'MyField' in the type.
         FieldBuilder myFieldBuilder =
            myTypeBuilder.DefineField("MyField", typeof(String), FieldAttributes.Public);
         Type myAttributeType1 = typeof(MyAttribute1);
         // Create a Constructorinfo object for attribute 'MyAttribute1'.
         ConstructorInfo myConstructorInfo = myAttributeType1.GetConstructor(
            new Type[1]{typeof(string)});
         // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         CustomAttributeBuilder attributeBuilder =
                     new CustomAttributeBuilder( myConstructorInfo,new object[1]{"Test"});
         // Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder);

          Type myAttributeType2 = typeof(MyAttribute2);
         // Create a Constructorinfo object for attribute 'MyAttribute2'.
        ConstructorInfo myConstructorInfo2 = myAttributeType2.GetConstructor(
            new Type[1]{typeof(bool)});
         // Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2,new byte[]{01,00,01,00,00});

         // Create a method.
         MethodBuilder myMethodBuilder= myTypeBuilder.DefineMethod("MyMethod",
            MethodAttributes.Public,null,new Type[2]{typeof(string),typeof(int)});

         ILGenerator myILGenerator = myMethodBuilder.GetILGenerator();
         myILGenerator.Emit(OpCodes.Ldarg_0);
         myILGenerator.Emit(OpCodes.Ldarg_1);
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder);
         myILGenerator.EmitWriteLine("Value of the Field is :");
         myILGenerator.EmitWriteLine(myFieldBuilder);
         myILGenerator.Emit(OpCodes.Ret);

         return myTypeBuilder.CreateType();
      }
      public static void Main()
      {
         try
         {
            Type myCustomClass = CreateCallee(Thread.GetDomain());
            // Construct an instance of a type.
            Object myObject = Activator.CreateInstance(myCustomClass);
            Console.WriteLine( "FieldBuilder Sample");
            // Find a method in this type and call it on this object.
            MethodInfo myMethodInfo = myCustomClass.GetMethod("MyMethod");
            myMethodInfo.Invoke(myObject, new object[2]{"Sample string",3});
            // Retrieve the values of Attributes applied to field and display to console.
            FieldInfo[] myFieldInfo = myCustomClass.GetFields();
            for(int i =0;i<myFieldInfo.Length;i++)
            {
               object[] attributes = myFieldInfo[i].GetCustomAttributes(true);
               for(int index=0; index < attributes.Length; index++)
               {
                  if(attributes[index] is MyAttribute1)
                  {
                     MyAttribute1 myCustomAttribute = (MyAttribute1)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute1): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
                  if(attributes[index] is MyAttribute2)
                  {
                     MyAttribute2 myCustomAttribute = (MyAttribute2)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute2): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
               }
            }
         }
         catch (Exception e)
         {
            Console.WriteLine("Exception Caught "+e.Message);
         }
      }
   }
}

[C++] 

#using <mscorlib.dll>

using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

[AttributeUsage(AttributeTargets::All, AllowMultiple = false)]
public __gc class MyAttribute1 : public Attribute 
{
public:
   String* myCustomAttributeValue;
   MyAttribute1(String* myString)
   {
      myCustomAttributeValue = myString;
   }
};

[AttributeUsage(AttributeTargets::All, AllowMultiple = false)]
public __gc class MyAttribute2 : public Attribute
{
public:
   bool myCustomAttributeValue;
   MyAttribute2(bool myBool) {
      myCustomAttributeValue = myBool;
   }
};

Type* CreateCallee(AppDomain* currentDomain) 
{

   // Create a simple name for the assembly.
   AssemblyName* myAssemblyName = new AssemblyName();
   myAssemblyName->Name = S"EmittedAssembly";
   // Create the called dynamic assembly.
   AssemblyBuilder* myAssemblyBuilder =
      currentDomain->DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess::RunAndSave);
   ModuleBuilder* myModuleBuilder =
      myAssemblyBuilder->DefineDynamicModule(S"EmittedModule", S"EmittedModule.mod");
   // Define a public class named 'CustomClass' in the assembly.
   TypeBuilder* myTypeBuilder = myModuleBuilder->DefineType(S"CustomClass",
      TypeAttributes::Public);
   // Define a private String field named 'MyField' in the type.
   FieldBuilder* myFieldBuilder =
      myTypeBuilder->DefineField(S"MyField", __typeof(String), FieldAttributes::Public);
   Type* myAttributeType1 = __typeof(MyAttribute1);
   // Create a Constructorinfo Object* for attribute 'MyAttribute1'.
   Type* type1[] = {__typeof(String)};
   ConstructorInfo* myConstructorInfo = myAttributeType1->GetConstructor(type1);
   // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
   Object* obj1[] = {S"Test"};
   CustomAttributeBuilder* attributeBuilder = new CustomAttributeBuilder(myConstructorInfo, obj1);
   // Set the CustomAttribute 'MyAttribute1' to the Field.
   myFieldBuilder->SetCustomAttribute(attributeBuilder);

   Type* myAttributeType2 = __typeof(MyAttribute2);
   // Create a Constructorinfo Object* for attribute 'MyAttribute2'.
   Type* type2[] = {__typeof(bool)};
   ConstructorInfo* myConstructorInfo2 = myAttributeType2->GetConstructor(type2);
   // Set the CustomAttribute 'MyAttribute2' to the Field.
   Byte bytes[] = {01, 00, 01, 00, 00};
   myFieldBuilder->SetCustomAttribute(myConstructorInfo2, bytes);

   // Create a method.
   Type* type3[] = {__typeof(String), __typeof(int)};
   MethodBuilder* myMethodBuilder= myTypeBuilder->DefineMethod(S"MyMethod",
      MethodAttributes::Public, 0, type3);

   ILGenerator* myILGenerator = myMethodBuilder->GetILGenerator();
   myILGenerator->Emit(OpCodes::Ldarg_0);
   myILGenerator->Emit(OpCodes::Ldarg_1);
   myILGenerator->Emit(OpCodes::Stfld, myFieldBuilder);
   myILGenerator->EmitWriteLine(S"Value of the Field is :");
   myILGenerator->EmitWriteLine(myFieldBuilder);
   myILGenerator->Emit(OpCodes::Ret);

   return myTypeBuilder->CreateType();
}

int main() 
{
   try {
      Type* myCustomClass = CreateCallee(Thread::GetDomain());
      // Construct an instance of a type.
      Object* myObject = Activator::CreateInstance(myCustomClass);
      Console::WriteLine(S"FieldBuilder Sample");
      // Find a method in this type and call it on this Object*.
      MethodInfo* myMethodInfo = myCustomClass->GetMethod(S"MyMethod");
      Object* obj1[] = {S"Sample string", __box(3)};
      myMethodInfo->Invoke(myObject, obj1);
      // Retrieve the values of Attributes applied to field and display to console.
      FieldInfo* myFieldInfo[] = myCustomClass->GetFields();
      for (int i =0;i<myFieldInfo->Length;i++) {
         Object* attributes[] = myFieldInfo[i]->GetCustomAttributes(true);
         for (int index=0; index < attributes->Length; index++) {
            if (dynamic_cast<MyAttribute1*>(attributes[index])) {
               MyAttribute1* myCustomAttribute = __try_cast<MyAttribute1*>(attributes[index]);
               Console::WriteLine(S"Attribute Value of (MyAttribute1): {0}", myCustomAttribute->myCustomAttributeValue);
            }
            if (dynamic_cast<MyAttribute2*>(attributes[index])) {
               MyAttribute2* myCustomAttribute = __try_cast<MyAttribute2*>(attributes[index]);
               Console::WriteLine(S"Attribute Value of (MyAttribute2): {0}", __box(myCustomAttribute->myCustomAttributeValue));
            }
         }
      }
   } catch (Exception* e) {
      Console::WriteLine(S"Exception Caught {0}", e->Message);
   }
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

FieldBuilder クラス | FieldBuilder メンバ | System.Reflection.Emit 名前空間 | FieldBuilder.SetCustomAttribute オーバーロードの一覧