IsLong IsLong IsLong IsLong Class

Definice

Označuje, že upravené celé číslo je standardní C++ long hodnota.Indicates that a modified integer is a standard C++ long value. Tuto třídu nelze zdědit.This class cannot be inherited.

public ref class IsLong abstract sealed
public static class IsLong
type IsLong = class
Public Class IsLong
Dědičnost
IsLongIsLongIsLongIsLong

Příklady

Následující příklad ukazuje, jak vygenerovat IsLong objekt do sestavení pomocí reflexe.The following example demonstrates how to emit an IsLong object into an assembly using reflection.



#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

C++ Standard označuje, že long hodnota a celočíselná hodnota jsou odlišné typy.The C++ standard indicates that a long value and an integer value are distinct types. Jsou však obě zastoupeny pomocí ELEMENT_TYPE_I4 v sestavení.However, they are both represented using ELEMENT_TYPE_I4 in an assembly. Chcete-li long odlišit od celého čísla C++v, kompilátor C++ IsLong společnosti Microsoft přidá modifikátor do jakékoli instance třídy long při vygenerování instance.To distinguish a long from an integer in C++, the Microsoft C++ compiler adds the IsLong modifier to any instance of a long when the instance is emited. Tento proces je kriticky důležitý pro zachování bezpečnosti typu na úrovni jazyka.This process is critically important for maintaining language-level type safety.

Kompilátory generují vlastní modifikátory v rámci metadat pro změnu způsobu, jakým kompilátor JIT (just-in-time) zpracovává hodnoty, pokud výchozí chování není vhodné.Compilers emit custom modifiers within metadata to change the way that the just-in-time (JIT) compiler handles values when the default behavior is not appropriate. Když kompilátor JIT nalezne vlastní modifikátor, zpracuje hodnotu způsobem, který určuje modifikátor.When the JIT compiler encounters a custom modifier, it handles the value in the way that the modifier specifies. Kompilátory mohou použít vlastní modifikátory na metody, parametry a návratové hodnoty.Compilers can apply custom modifiers to methods, parameters, and return values. Kompilátor JIT musí reagovat na požadované modifikátory, ale může ignorovat volitelné modifikátory.The JIT compiler must respond to required modifiers but can ignore optional modifiers.

Vlastní modifikátory můžete vygenerovat do metadat pomocí jednoho z následujících postupů:You can emit custom modifiers into metadata using one of the following techniques:

Platí pro