IsLong Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Değiştirilen tamsayının standart bir C++ long
değeri olduğunu gösterir. Bu sınıf devralınamaz.
public ref class IsLong abstract sealed
public static class IsLong
type IsLong = class
Public Class IsLong
- Devralma
-
IsLong
Örnekler
Aşağıdaki örnekte, yansıma kullanarak bir IsLong nesnenin derlemeye nasıl yaydığı gösterilmektedir.
#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.");
}
Açıklamalar
C++ standardı, bir long
değerin ve tamsayı değerinin ayrı türler olduğunu gösterir. Ancak, her ikisi de bir derlemede kullanılarak ELEMENT_TYPE_I4
temsil edilir. C++ içindeki bir long
tamsayıdan ayırt etmek için Microsoft C++ derleyicisi, örnek yayıldığında değiştiriciyi herhangi bir long
örneğine eklerIsLong. Bu işlem, dil düzeyinde tür güvenliğini korumak için kritik öneme sahiptir.
Derleyiciler, varsayılan davranış uygun olmadığında tam zamanında (JIT) derleyicinin değerleri işleme biçimini değiştirmek için meta veriler içinde özel değiştiriciler yayar. JIT derleyicisi özel bir değiştiriciyle karşılaştığında, değeri değiştiricinin belirttiği şekilde işler. Derleyiciler yöntemlere, parametrelere ve dönüş değerlerine özel değiştiriciler uygulayabilir. JIT derleyicisi gerekli değiştiricilere yanıt vermelidir, ancak isteğe bağlı değiştiricileri yoksayabilir.
Aşağıdaki tekniklerden birini kullanarak meta verilerde özel değiştiriciler yayabilirsiniz:
sınıfında , , DefineFieldDefineConstructorve DefinePropertygibi DefineMethodyöntemleri TypeBuilder kullanma.
ve çağrılarını
modopt
içeren bir Microsoft ara dili (MSIL) yönerge dosyası oluşturma ve dosyayı Ilasm.exe (IL Assembler) ile derleme.modreq
Yönetilmeyen yansıma API'sini kullanma.