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
注解
使用此方法创建的字段将为 static
,即使参数中attributes
不包含 FieldAttributes.Static
。