IsBoxed Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Azt jelzi, hogy a módosított referenciatípus egy dobozos értéktípus. Ez az osztály nem örökölhető.
public ref class IsBoxed abstract sealed
public static class IsBoxed
type IsBoxed = class
Public Class IsBoxed
- Öröklődés
-
IsBoxed
Példák
Az alábbi példa bemutatja, hogyan bocsáthat ki objektumot egy IsBoxed szerelvénybe tükröződés használatával.
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::CompilerServices;
using namespace System::Threading;
ref class CodeEmitter
{
private:
AssemblyBuilder^ asmBuilder;
String^ asmName;
ModuleBuilder^ modBuilder;
void prepareAssembly(String^ name){
// Check the input.
if(!name){
throw gcnew ArgumentNullException("AssemblyName");
}
asmName = name;
// Create an AssemblyName object and set the name.
AssemblyName^ asmName = gcnew AssemblyName();
asmName->Name = name;
// Use the AppDomain class to create an AssemblyBuilder instance.
AppDomain^ currentDomain = Thread::GetDomain();
asmBuilder = currentDomain->DefineDynamicAssembly(asmName,AssemblyBuilderAccess::RunAndSave);
// Create a dynamic module.
modBuilder = asmBuilder->DefineDynamicModule(name);
}
public:
// Constructor.
CodeEmitter(String ^ AssemblyName){
prepareAssembly(AssemblyName);
}
// Create a new type.
TypeBuilder^ CreateType(String^ name){
// Check the input.
if(!name){
throw gcnew ArgumentNullException("AssemblyName");
}
return modBuilder->DefineType( name );
}
// Write the assembly.
void WriteAssembly(MethodBuilder^ entryPoint){
// Check the input.
if(!entryPoint){
throw gcnew ArgumentNullException("entryPoint");
}
asmBuilder->SetEntryPoint( entryPoint );
asmBuilder->Save( asmName );
}
};
void main()
{
// Create a CodeEmitter to handle assembly creation.
CodeEmitter ^ e = gcnew CodeEmitter("program.exe");
// Create a new type.
TypeBuilder^ mainClass = e->CreateType("MainClass");
// Create a new method.
MethodBuilder^ mBuilder = mainClass->DefineMethod("mainMethod", MethodAttributes::Static);
// Create an ILGenerator and emit IL for
// a simple "Hello World." program.
ILGenerator^ ilGen = mBuilder->GetILGenerator();
ilGen->Emit(OpCodes::Ldstr, "Hello World");
array<Type^>^mType = {String::typeid};
MethodInfo^ writeMI = Console::typeid->GetMethod( "WriteLine", mType );
ilGen->EmitCall(OpCodes::Call, writeMI, nullptr );
ilGen->Emit( OpCodes::Ret );
/////////////////////////////////////////////////
/////////////////////////////////////////////////
// Apply a required custom modifier
// to a field.
/////////////////////////////////////////////////
/////////////////////////////////////////////////
array<Type^>^fType = {IsBoxed::typeid};
mainClass->DefineField("modifiedInteger", Type::GetType("System.Int32"), fType, nullptr, FieldAttributes::Private);
// Create the type.
mainClass->CreateType();
// Write the assembly using a reference to
// the entry point.
e->WriteAssembly(mBuilder);
Console::WriteLine(L"Assembly created.");
}
Megjegyzések
A Microsoft C++ fordító közvetlenül a nyelven támogatja a dobozos értéktípusokat. A dobozos értéktípusokra vonatkozó információk egyéni módosítóként metaadatokba kerülnek, ahol a módosító a bekeretezett értéktípusra mutató hivatkozást díszít.
A fordítók egyéni módosítókat bocsátanak ki a metaadatokon belül, hogy megváltoztassa, hogy az igény szerinti (JIT) fordító hogyan kezeli az értékeket, ha az alapértelmezett viselkedés nem megfelelő. Amikor a JIT-fordító egyéni módosítóval találkozik, a módosító által megadott módon kezeli az értéket. A fordítók egyéni módosítókat alkalmazhatnak metódusokra, paraméterekre és visszaadott értékekre. A JIT-fordítónak válaszolnia kell a szükséges módosítókra, de figyelmen kívül hagyhatja az opcionális módosítókat.
Az alábbi technikák egyikével egyéni módosítókat bocsáthat ki metaadatokba:
Metódusok használata az TypeBuilder osztályban, például DefineMethod, DefineField, DefineConstructorés DefineProperty.
Létrehoz egy Microsoft köztes nyelvi (MSIL) utasításfájlt, amely
modoptésmodreqhívásokat tartalmaz, és a fájlt a Ilasm.exe (IL-összeszerelő).A nem felügyelt tükröződési API használata.