ConstructorBuilder.SetCustomAttribute 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
사용자 지정 특성을 설정합니다.
오버로드
| Name | Description |
|---|---|
| SetCustomAttribute(ConstructorInfo, Byte[]) |
지정된 사용자 지정 특성 Blob을 사용하여 사용자 지정 특성을 설정합니다. |
| SetCustomAttribute(CustomAttributeBuilder) |
사용자 지정 특성 작성기를 사용하여 사용자 지정 특성을 설정합니다. |
SetCustomAttribute(ConstructorInfo, Byte[])
지정된 사용자 지정 특성 Blob을 사용하여 사용자 지정 특성을 설정합니다.
public:
void SetCustomAttribute(System::Reflection::ConstructorInfo ^ con, cli::array <System::Byte> ^ binaryAttribute);
public void SetCustomAttribute(System.Reflection.ConstructorInfo con, byte[] binaryAttribute);
[System.Runtime.InteropServices.ComVisible(true)]
public void SetCustomAttribute(System.Reflection.ConstructorInfo con, byte[] binaryAttribute);
member this.SetCustomAttribute : System.Reflection.ConstructorInfo * byte[] -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
member this.SetCustomAttribute : System.Reflection.ConstructorInfo * byte[] -> unit
Public Sub SetCustomAttribute (con As ConstructorInfo, binaryAttribute As Byte())
매개 변수
- con
- ConstructorInfo
사용자 지정 특성의 생성자입니다.
- binaryAttribute
- Byte[]
특성을 나타내는 바이트 Blob입니다.
- 특성
예외
con 또는 binaryAttribute .입니다 null.
예제
다음 코드 샘플에서는 바이트 Blob을 전달하는 컨텍스트의 ConstructorBuilder사용을 SetCustomAttribute 보여 줍니다.
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class MyAttribute : Attribute
{
public bool myBoolean;
public MyAttribute(bool myBoolean)
{
this.myBoolean = myBoolean;
}
}
public class MyConstructorBuilder
{
public static void Main()
{
Type myHelloworld = MyCreateCallee(Thread.GetDomain());
ConstructorInfo myConstructor = myHelloworld.GetConstructor(new Type[]{typeof(String)});
object[] myAttributes1 = myConstructor.GetCustomAttributes(true);
Console.WriteLine("MyAttribute custom attribute contains ");
for(int index=0; index < myAttributes1.Length; index++)
{
if(myAttributes1[index] is MyAttribute)
{
Console.WriteLine("myBoolean : " + ((MyAttribute)myAttributes1[index]).myBoolean);
}
}
}
private static Type MyCreateCallee(AppDomain domain)
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "EmittedAssembly";
// Define a dynamic assembly in the current application domain.
AssemblyBuilder myAssembly =
domain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Run);
// Define a dynamic module in this assembly.
ModuleBuilder myModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule");
// Construct a 'TypeBuilder' given the name and attributes.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("HelloWorld",
TypeAttributes.Public);
// Define a constructor of the dynamic class.
ConstructorBuilder myConstructor = myTypeBuilder.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard, new Type[]{typeof(String)});
ILGenerator myILGenerator = myConstructor.GetILGenerator();
myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked");
myILGenerator.Emit(OpCodes.Ldarg_1);
MethodInfo myMethodInfo =
typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)});
myILGenerator.Emit(OpCodes.Call, myMethodInfo);
myILGenerator.Emit(OpCodes.Ret);
Type myType = typeof(MyAttribute);
ConstructorInfo myConstructorInfo = myType.GetConstructor(new Type[]{typeof(bool)});
try
{
myConstructor.SetCustomAttribute(myConstructorInfo, new byte[]{01,00,01});
}
catch(ArgumentNullException ex)
{
Console.WriteLine("The following exception has occurred : "+ex.Message);
}
catch(Exception ex)
{
Console.WriteLine("The following exception has occurred : "+ex.Message);
}
return myTypeBuilder.CreateType();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
<AttributeUsage(AttributeTargets.All, AllowMultiple := False)> _
Public Class MyAttribute
Inherits Attribute
Public myBoolean As Boolean
Public Sub New(myBoolean As Boolean)
Me.myBoolean = myBoolean
End Sub
End Class
Public Class MyConstructorBuilder
Public Shared Sub Main()
Dim myHelloworld As Type = MyCreateCallee(Thread.GetDomain())
Dim myConstructor As ConstructorInfo = myHelloworld.GetConstructor(New Type() _
{GetType(String)})
Dim myAttributes1 As Object() = myConstructor.GetCustomAttributes(True)
Console.WriteLine("MyAttribute custom attribute contains ")
Dim index As Integer
For index = 0 To myAttributes1.Length - 1
If TypeOf myAttributes1(index) Is MyAttribute Then
Console.WriteLine("myBoolean : " + _
CType(myAttributes1(index), MyAttribute).myBoolean.ToString())
End If
Next index
End Sub
Private Shared Function MyCreateCallee(domain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "EmittedAssembly"
' Define a dynamic assembly in the current application domain.
Dim myAssembly As AssemblyBuilder = domain.DefineDynamicAssembly _
(myAssemblyName, AssemblyBuilderAccess.Run)
' Define a dynamic module in this assembly.
Dim myModuleBuilder As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Construct a 'TypeBuilder' given the name and attributes.
Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType _
("HelloWorld", TypeAttributes.Public)
' Define a constructor of the dynamic class.
Dim myConstructor As ConstructorBuilder = myTypeBuilder.DefineConstructor _
(MethodAttributes.Public, CallingConventions.Standard, New Type() {GetType(String)})
Dim myILGenerator As ILGenerator = myConstructor.GetILGenerator()
myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked")
myILGenerator.Emit(OpCodes.Ldarg_1)
Dim myMethodInfo As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() _
{GetType(String)})
myILGenerator.Emit(OpCodes.Call, myMethodInfo)
myILGenerator.Emit(OpCodes.Ret)
Dim myType As Type = GetType(MyAttribute)
Dim myConstructorInfo As ConstructorInfo = myType.GetConstructor(New Type() {GetType(Boolean)})
Try
myConstructor.SetCustomAttribute(myConstructorInfo, New Byte() {1, 0, 1})
Catch ex As ArgumentNullException
Console.WriteLine("The following exception has occurred : " + ex.Message)
Catch ex As Exception
Console.WriteLine("The following exception has occurred : " + ex.Message)
End Try
Return myTypeBuilder.CreateType()
End Function 'MyCreateCallee
End Class
설명
서식을 지정 binaryAttribute하는 방법에 대한 자세한 내용은 CLI(공용 언어 인프라) 사양의 파티션 II에서 메타데이터 사양을 참조하세요.
적용 대상
SetCustomAttribute(CustomAttributeBuilder)
사용자 지정 특성 작성기를 사용하여 사용자 지정 특성을 설정합니다.
public:
void SetCustomAttribute(System::Reflection::Emit::CustomAttributeBuilder ^ customBuilder);
public void SetCustomAttribute(System.Reflection.Emit.CustomAttributeBuilder customBuilder);
member this.SetCustomAttribute : System.Reflection.Emit.CustomAttributeBuilder -> unit
Public Sub SetCustomAttribute (customBuilder As CustomAttributeBuilder)
매개 변수
- customBuilder
- CustomAttributeBuilder
사용자 지정 특성을 정의하는 도우미 클래스의 인스턴스입니다.
예외
customBuilder은 null입니다.
예제
다음 코드 샘플에서는 컨텍스트를 SetCustomAttribute 사용하여 .를 전달하는 CustomAttributeBuilder방법을 ConstructorBuilder보여 줍니다.
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class MyAttribute : Attribute
{
public String myString;
public int myInteger;
public MyAttribute(String myString, int myInteger)
{
this.myString = myString;
this.myInteger = myInteger;
}
}
public class MyConstructorBuilder
{
public static void Main()
{
Type myHelloworld = MyCreateCallee(Thread.GetDomain());
ConstructorInfo myConstructor = myHelloworld.GetConstructor(new Type[]{typeof(String)});
object[] myAttributes1 = myConstructor.GetCustomAttributes(true);
Console.WriteLine("MyAttribute custom attribute contains ");
for(int index=0; index < myAttributes1.Length; index++)
{
if(myAttributes1[index] is MyAttribute)
{
Console.WriteLine("The value of myString is : "
+ ((MyAttribute)myAttributes1[index]).myString);
Console.WriteLine("The value of myInteger is : "
+ ((MyAttribute)myAttributes1[index]).myInteger);
}
}
}
private static Type MyCreateCallee(AppDomain domain)
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "EmittedAssembly";
// Define a dynamic assembly in the current application domain.
AssemblyBuilder myAssembly =
domain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Run);
// Define a dynamic module in this assembly.
ModuleBuilder myModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule");
// Construct a 'TypeBuilder' given the name and attributes.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("HelloWorld",
TypeAttributes.Public);
// Define a constructor of the dynamic class.
ConstructorBuilder myConstructor = myTypeBuilder.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard, new Type[]{typeof(String)});
ILGenerator myILGenerator = myConstructor.GetILGenerator();
myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked");
myILGenerator.Emit(OpCodes.Ldarg_1);
MethodInfo myMethodInfo =
typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)});
myILGenerator.Emit(OpCodes.Call, myMethodInfo);
myILGenerator.Emit(OpCodes.Ret);
Type myType = typeof(MyAttribute);
ConstructorInfo myConstructorInfo = myType.GetConstructor(new Type[2]{typeof(String), typeof(int)});
CustomAttributeBuilder attributeBuilder =
new CustomAttributeBuilder(myConstructorInfo, new object[2]{"Hello", 2});
try
{
myConstructor.SetCustomAttribute(attributeBuilder);
}
catch(ArgumentNullException ex)
{
Console.WriteLine("The following exception has occurred : "+ex.Message);
}
catch(Exception ex)
{
Console.WriteLine("The following exception has occurred : "+ex.Message);
}
return myTypeBuilder.CreateType();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
<AttributeUsage(AttributeTargets.All, AllowMultiple := False)> _
Public Class MyAttribute
Inherits Attribute
Public myString As String
Public myInteger As Integer
Public Sub New(myString As String, myInteger As Integer)
Me.myString = myString
Me.myInteger = myInteger
End Sub
End Class
Public Class MyConstructorBuilder
Public Shared Sub Main()
Dim myHelloworld As Type = MyCreateCallee(Thread.GetDomain())
Dim myConstructor As ConstructorInfo = myHelloworld.GetConstructor(New Type() _
{GetType(String)})
Dim myAttributes1 As Object() = myConstructor.GetCustomAttributes(True)
Console.WriteLine("MyAttribute custom attribute contains ")
Dim index As Integer
For index = 0 To myAttributes1.Length - 1
If TypeOf myAttributes1(index) Is MyAttribute Then
Console.WriteLine("The value of myString is : " + CType(myAttributes1(index), _
MyAttribute).myString)
Console.WriteLine("The value of myInteger is : " + CType(myAttributes1(index), _
MyAttribute).myInteger.ToString())
End If
Next index
End Sub
Private Shared Function MyCreateCallee(domain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "EmittedAssembly"
' Define a dynamic assembly in the current application domain.
Dim myAssembly As AssemblyBuilder = domain.DefineDynamicAssembly _
(myAssemblyName, AssemblyBuilderAccess.Run)
' Define a dynamic module in this assembly.
Dim myModuleBuilder As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Construct a 'TypeBuilder' given the name and attributes.
Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType _
("HelloWorld", TypeAttributes.Public)
' Define a constructor of the dynamic class.
Dim myConstructor As ConstructorBuilder = myTypeBuilder.DefineConstructor _
(MethodAttributes.Public, CallingConventions.Standard, New Type() {GetType(String)})
Dim myILGenerator As ILGenerator = myConstructor.GetILGenerator()
myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked")
myILGenerator.Emit(OpCodes.Ldarg_1)
Dim myMethodInfo As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() _
{GetType(String)})
myILGenerator.Emit(OpCodes.Call, myMethodInfo)
myILGenerator.Emit(OpCodes.Ret)
Dim myType As Type = GetType(MyAttribute)
Dim myConstructorInfo As ConstructorInfo = myType.GetConstructor(New Type(1) _
{GetType(String), GetType(Integer)})
Dim attributeBuilder As New CustomAttributeBuilder _
(myConstructorInfo, New Object(1) {"Hello", 2})
Try
myConstructor.SetCustomAttribute(attributeBuilder)
Catch ex As ArgumentNullException
Console.WriteLine("The following exception has occurred : " + ex.Message)
Catch ex As Exception
Console.WriteLine("The following exception has occurred : " + ex.Message)
End Try
Return myTypeBuilder.CreateType()
End Function 'MyCreateCallee
End Class