IsExplicitlyDereferenced Classe

Definição

Indica que um ponteiro gerido representa um parâmetro de ponteiro dentro de uma assinatura de método. Esta classe não pode ser herdada.

public ref class IsExplicitlyDereferenced abstract sealed
public static class IsExplicitlyDereferenced
type IsExplicitlyDereferenced = class
Public Class IsExplicitlyDereferenced
Herança
IsExplicitlyDereferenced

Exemplos

O exemplo seguinte demonstra como emitir um IsExplicitlyDereferenced objeto numa montagem usando reflexão.



#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 = {IsExplicitlyDereferenced::typeid};

    mainClass->DefineField("modifiedInteger", Type::GetType("System.IntPtr"), 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.");
}

Observações

Em C++, ponteiros e referências geridas são emitidos em metadados como ponteiros. Para distinguir entre os dois tipos nos metadados, o compilador Microsoft C++ aplica este modificador a ponteiros geridos. Não emite nenhum modificador nos tipos de referência geridas. Os compiladores precisam de conhecer a sintaxe correta de chamadas ao importar um método a partir do âmbito de metadados. A IsExplicitlyDereferenced classe e a sua parceira, a IsImplicitlyDereferenced classe, desambiguam parâmetros de referência dos parâmetros do apontador.

Os compiladores emitem modificadores personalizados dentro dos metadados para alterar a forma como o compilador just-in-time (JIT) lida com os valores quando o comportamento padrão não é apropriado. Quando o compilador JIT encontra um modificador personalizado, trata o valor da forma que o modificador especifica. Os compiladores podem aplicar modificadores personalizados a métodos, parâmetros e valores de retorno. O compilador JIT deve responder aos modificadores necessários, mas pode ignorar modificadores opcionais.

Pode emitir modificadores personalizados em metadados usando uma das seguintes técnicas:

Aplica-se a