TypeBuilder.DefineUninitializedData(String, Int32, FieldAttributes) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
PE(이식 가능) 파일의 .sdata
섹션에서 초기화되지 않은 데이터 필드를 정의합니다.
public:
System::Reflection::Emit::FieldBuilder ^ DefineUninitializedData(System::String ^ name, int size, System::Reflection::FieldAttributes attributes);
public System.Reflection.Emit.FieldBuilder DefineUninitializedData (string name, int size, System.Reflection.FieldAttributes attributes);
member this.DefineUninitializedData : string * int * System.Reflection.FieldAttributes -> System.Reflection.Emit.FieldBuilder
Public Function DefineUninitializedData (name As String, size As Integer, attributes As FieldAttributes) As FieldBuilder
매개 변수
- name
- String
데이터를 참조하는 데 사용되는 이름입니다.
name
에는 내장된 null이 포함될 수 없습니다.
- size
- Int32
데이터 필드의 크기입니다.
- attributes
- FieldAttributes
필드에 대한 특성입니다.
반환
데이터를 참조할 필드입니다.
예외
name
이(가) null
인 경우
CreateType()을 사용하여 이전에 형식을 만들었습니다.
예제
다음 코드 샘플에서는 를 사용하여 DefineUninitializedData
동적 형식으로 초기화되지 않은 데이터 필드를 만드는 방법을 보여 줍니다.
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;
public ref class Example
{
public:
[SecurityPermission(SecurityAction::Demand, Flags=SecurityPermissionFlag::UnmanagedCode)]
static void Main()
{
Type^ myHelloWorldType = CreateCallee( Thread::GetDomain() );
Object^ myHelloWorldInstance = Activator::CreateInstance( myHelloWorldType );
FieldInfo^ myGreetingFieldInfo = myHelloWorldType->GetField( "MyGreeting" );
Object^ oval = Activator::CreateInstance( myGreetingFieldInfo->FieldType );
IntPtr myIntPtr = Marshal::AllocHGlobal( 4 );
Random^ rand = gcnew Random;
int iTempSeed = rand->Next();
array<Byte>^bINITBYTE = GetRandBytes( iTempSeed, 4 );
IntPtr intptrTemp = myIntPtr;
for ( int j = 0; j < 4; j++ )
{
Marshal::WriteByte( myIntPtr, bINITBYTE[ j ] );
myIntPtr = (IntPtr)((int)myIntPtr + 1);
}
myIntPtr = intptrTemp;
Object^ oValNew = Marshal::PtrToStructure( myIntPtr, myGreetingFieldInfo->FieldType );
Marshal::FreeHGlobal( myIntPtr );
myIntPtr = Marshal::AllocHGlobal( 4 );
Object^ myObj = myGreetingFieldInfo->GetValue( myHelloWorldInstance );
Marshal::StructureToPtr( myObj, myIntPtr, true );
intptrTemp = myIntPtr;
Console::WriteLine( "The value of 'MyGreeting' field : " );
for ( int j = 0; j < 4; j++ )
{
Marshal::WriteByte( myIntPtr, bINITBYTE[ j ] );
Console::WriteLine( bINITBYTE[ j ] );
myIntPtr = (IntPtr)((int)myIntPtr + 1);
}
}
private:
static array<Byte>^ GetRandBytes( int iRandSeed, int iSize )
{
array<Byte>^barr = gcnew array<Byte>(iSize);
Random^ randTemp = gcnew Random( iRandSeed );
randTemp->NextBytes( barr );
return barr;
}
// Create the callee transient dynamic assembly.
static Type^ CreateCallee( AppDomain^ myDomain )
{
// Create a simple name for the callee assembly.
AssemblyName^ myAssemblyName = gcnew AssemblyName;
myAssemblyName->Name = "EmittedClass";
// Create the callee dynamic assembly.
AssemblyBuilder^ myAssembly = myDomain->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::Run );
// Create a dynamic module in the callee assembly.
ModuleBuilder^ myModule = myAssembly->DefineDynamicModule( "EmittedModule" );
// Define a public class named "MyHelloWorld"
TypeBuilder^ myHelloWorldType = myModule->DefineType( "MyHelloWorld", TypeAttributes::Public );
// Define a 'MyGreeting' field and initialize it.
FieldBuilder^ myFieldBuilder = myHelloWorldType->DefineUninitializedData( "MyGreeting", 4, FieldAttributes::Public );
// Create the 'MyHelloWorld' class.
return (myHelloWorldType->CreateType());
}
};
int main()
{
Example::Main();
}
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using System.Security.Permissions;
public sealed class Example
{
public static void Main()
{
Type myHelloWorldType = CreateCallee(Thread.GetDomain());
object myHelloWorldInstance =
Activator.CreateInstance(myHelloWorldType);
FieldInfo myGreetingFieldInfo =
myHelloWorldType.GetField("MyGreeting");
object oval = Activator.CreateInstance(myGreetingFieldInfo.FieldType);
IntPtr myIntPtr = Marshal.AllocHGlobal(4);
Random rand = new Random();
int iTempSeed = rand.Next();
byte[] bINITBYTE = GetRandBytes( iTempSeed, 4);
IntPtr intptrTemp = myIntPtr;
for ( int j = 0; j < 4; j++ )
{
Marshal.WriteByte( myIntPtr, bINITBYTE[j]);
myIntPtr = (IntPtr)((int)myIntPtr + 1);
}
myIntPtr = intptrTemp;
Object oValNew = Marshal.PtrToStructure( myIntPtr, myGreetingFieldInfo.FieldType);
Marshal.FreeHGlobal( myIntPtr );
myIntPtr = Marshal.AllocHGlobal(4);
object myObj = myGreetingFieldInfo.GetValue(myHelloWorldInstance);
Marshal.StructureToPtr(myObj, myIntPtr, true);
intptrTemp = myIntPtr;
Console.WriteLine("The value of 'MyGreeting' field : ");
for ( int j = 0; j < 4; j++ )
{
Marshal.WriteByte( myIntPtr, bINITBYTE[j]);
Console.WriteLine(bINITBYTE[j]);
myIntPtr = (IntPtr)((int)myIntPtr + 1);
}
}
private static byte[] GetRandBytes( int iRandSeed, int iSize )
{
byte[] barr = new byte[iSize];
Random randTemp = new Random( iRandSeed );
randTemp.NextBytes( barr );
return barr;
}
// Create the callee transient dynamic assembly.
private static Type CreateCallee(AppDomain myDomain)
{
// Create a simple name for the callee assembly.
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "EmittedClass";
// Create the callee dynamic assembly.
AssemblyBuilder myAssembly =
myDomain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Run);
// Create a dynamic module in the callee assembly.
ModuleBuilder myModule =
myAssembly.DefineDynamicModule("EmittedModule");
// Define a public class named "MyHelloWorld"
TypeBuilder myHelloWorldType =
myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
// Define a 'MyGreeting' field and initialize it.
FieldBuilder myFieldBuilder =
myHelloWorldType.DefineUninitializedData("MyGreeting",4,FieldAttributes.Public);
// Create the 'MyHelloWorld' class.
return(myHelloWorldType.CreateType());
}
private Example() {}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Module Example
Sub Main()
Dim myHelloWorldType As Type = CreateCallee(Thread.GetDomain())
Dim myHelloWorldInstance As Object = Activator.CreateInstance(myHelloWorldType)
Dim myGreetingFieldInfo As FieldInfo = myHelloWorldType.GetField("MyGreeting")
Dim oval As Object = Activator.CreateInstance(myGreetingFieldInfo.FieldType)
Dim myIntPtr As IntPtr = Marshal.AllocHGlobal(4)
Dim rand As New Random()
Dim iTempSeed As Integer = rand.Next()
Dim bINITBYTE As Byte() = GetRandBytes(iTempSeed, 4)
Dim intptrTemp As IntPtr = myIntPtr
Dim j As Integer
For j = 0 To 3
Marshal.WriteByte(myIntPtr, bINITBYTE(j))
myIntPtr = intptr.op_Explicit(myIntPtr.ToInt32 + 1)
Next j
myIntPtr = intptrTemp
Dim oValNew As [Object] = Marshal.PtrToStructure(myIntPtr, myGreetingFieldInfo.FieldType)
Marshal.FreeHGlobal(myIntPtr)
myIntPtr = Marshal.AllocHGlobal(4)
Dim myObj As Object = myGreetingFieldInfo.GetValue(myHelloWorldInstance)
Marshal.StructureToPtr(myObj, myIntPtr, True)
intptrTemp = myIntPtr
Console.WriteLine("The value of 'MyGreeting' field : ")
For j = 0 To 3
Marshal.WriteByte(myIntPtr, bINITBYTE(j))
Console.WriteLine(bINITBYTE(j))
myIntPtr = intptr.op_Explicit(myIntPtr.ToInt32 + 1)
Next j
End Sub
Private Function GetRandBytes(ByVal iRandSeed As Integer, ByVal iSize As Integer) As Byte()
Dim barr(iSize) As Byte
Dim randTemp As New Random(iRandSeed)
randTemp.NextBytes(barr)
Return barr
End Function 'GetRandBytes
' Create the callee transient dynamic assembly.
Private Function CreateCallee(ByVal myDomain As AppDomain) As Type
' Create a simple name for the callee assembly.
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "EmittedClass"
' Create the callee dynamic assembly.
Dim myAssembly As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)
' Create a dynamic module in the callee assembly.
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Define a public class named "MyHelloWorld"
Dim myHelloWorldType As TypeBuilder = myModule.DefineType("MyHelloWorld", TypeAttributes.Public)
' Define a 'MyGreeting' field and initialize it.
Dim myFieldBuilder As FieldBuilder = myHelloWorldType.DefineUninitializedData("MyGreeting", 4, FieldAttributes.Public)
' Create the 'MyHelloWorld' class.
Return myHelloWorldType.CreateType()
End Function 'CreateCallee
End Module
설명
매개 변수에 를 포함하지 FieldAttributes.Static
않더라도 이 메서드static
를 사용하여 만드는 필드는 입니다attributes
.
적용 대상
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET