IsPinned Klas

Definitie

Geeft aan dat een gewijzigd exemplaar is vastgemaakt in het geheugen. Deze klasse kan niet worden overgenomen.

public ref class IsPinned abstract sealed
public static class IsPinned
type IsPinned = class
Public Class IsPinned
Overname
IsPinned

Voorbeelden

In het volgende voorbeeld ziet u hoe u een IsPinned object in een assembly verzendt met behulp van weerspiegeling.



#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 = {IsPinned::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.");
}

Opmerkingen

Compilers verzenden aangepaste modifiers binnen metagegevens om de manier te wijzigen waarop de Just-In-Time-compiler (JIT) waarden verwerkt wanneer het standaardgedrag niet geschikt is. Wanneer de JIT-compiler een aangepaste wijzigingsfunctie tegenkomt, wordt de waarde verwerkt op de manier die door de wijzigingsfunctie wordt opgegeven. Compilers kunnen aangepaste modifiers toepassen op methoden, parameters en retourwaarden. De JIT-compiler moet reageren op vereiste modifiers, maar kan optionele modifiers negeren. Een C++-compiler kan een aangepaste wijzigingsfunctie verzenden om te beschrijven hoe een byte moet worden behandeld in gevallen waarin de JIT-compiler bytes op een manier behandelt die standaard niet compatibel is met C++ .

U kunt aangepaste modifiers verzenden naar metagegevens met behulp van een van de volgende technieken:

Van toepassing op