IsLong Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Označuje, že změněné celé číslo je standardní hodnota jazyka C++ long
. Tato třída se nemůže dědit.
public ref class IsLong abstract sealed
public static class IsLong
type IsLong = class
Public Class IsLong
- Dědičnost
-
IsLong
Příklady
Následující příklad ukazuje, jak generovat IsLong objekt do sestavení pomocí odrazu.
#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.");
}
Poznámky
Standard jazyka C++ označuje, že long
hodnota a celočíselná hodnota jsou odlišné typy. Obě jsou však reprezentovány pomocí ELEMENT_TYPE_I4
v sestavení. Chcete-li odlišit long
od celého čísla v jazyce C++, kompilátor jazyka Microsoft C++ přidá IsLong modifikátor do libovolné instance long
při generování instance. Tento proces je velmi důležitý pro zajištění bezpečnosti typů na úrovni jazyka.
Kompilátory v rámci metadat vygenerují vlastní modifikátory, aby změnily způsob, jakým kompilátor za běhu (JIT) zpracovává hodnoty v případě, že výchozí chování není vhodné. Když kompilátor JIT narazí na vlastní modifikátor, zpracuje hodnotu způsobem, který určuje modifikátor. Kompilátory můžou použít vlastní modifikátory pro metody, parametry a návratové hodnoty. Kompilátor JIT musí reagovat na požadované modifikátory, ale může volitelné modifikátory ignorovat.
Do metadat můžete generovat vlastní modifikátory pomocí jedné z následujících technik:
Použití metod ve TypeBuilder třídě, jako DefineMethodjsou , DefineFieldDefineConstructor, a DefineProperty.
Generování instrukčního souboru jazyka MSIL (Microsoft Intermediate Language), který obsahuje volání
modopt
amodreq
, a sestavení souboru sIlasm.exe (IL Assembler).Použití nespravovaného rozhraní API pro reflexi