IsLong Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Anger att ett ändrat heltal är ett C++ long -standardvärde. Det går inte att ärva den här klassen.
public ref class IsLong abstract sealed
public static class IsLong
type IsLong = class
Public Class IsLong
- Arv
-
IsLong
Exempel
I följande exempel visas hur du genererar ett IsLong objekt till en sammansättning med reflektion.
#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 = {IsLong::typeid};
mainClass->DefineField("modifiedInteger", Type::GetType("System.Int64"), 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.");
}
Kommentarer
C++-standarden anger att ett long värde och ett heltalsvärde är distinkta typer. Båda representeras dock med hjälp av ELEMENT_TYPE_I4 i en sammansättning. För att skilja en long från ett heltal i C++, lägger Microsoft C++-kompilatorn IsLong-modifieraren till alla instanser av en long när instansen genereras. Den här processen är av avgörande betydelse för att upprätthålla säkerheten på språknivå.
Kompilatorer genererar anpassade modifierare i metadata för att ändra hur jit-kompilatorn (just-in-time) hanterar värden när standardbeteendet inte är lämpligt. När JIT-kompilatorn stöter på en anpassad modifierare hanterar den värdet på det sätt som modifieraren anger. Kompilatorer kan använda anpassade modifierare för metoder, parametrar och returvärden. JIT-kompilatorn måste svara på nödvändiga modifierare men kan ignorera valfria modifierare.
Du kan generera anpassade modifierare i metadata med någon av följande tekniker:
Använda metoder i TypeBuilder klassen, till exempel DefineMethod, DefineField, DefineConstructoroch DefineProperty.
Genererar en msil-instruktionsfil (Microsoft mellanliggande språk) som innehåller anrop till
modoptochmodreqoch monterar filen med Ilasm.exe (IL Assembler).Använda det ohanterade reflektions-API:et.