IsExplicitlyDereferenced IsExplicitlyDereferenced IsExplicitlyDereferenced IsExplicitlyDereferenced Class

Определение

Указывает, что управляемый указатель представляет параметр-указатель внутри сигнатуры метода.Indicates that a managed pointer represents a pointer parameter within a method signature. Этот класс не наследуется.This class cannot be inherited.

public ref class IsExplicitlyDereferenced abstract sealed
public static class IsExplicitlyDereferenced
type IsExplicitlyDereferenced = class
Public Class IsExplicitlyDereferenced
Наследование
IsExplicitlyDereferencedIsExplicitlyDereferencedIsExplicitlyDereferencedIsExplicitlyDereferenced

Примеры

В следующем примере показано, как выдать IsExplicitlyDereferenced объект в сборку с помощью отражения.The following example demonstrates how to emit an IsExplicitlyDereferenced 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 = {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.");
}

Комментарии

В C++управляемые указатели и управляемые ссылки передаются в метаданные в виде указателей.In C++, managed pointers and managed references are emitted into metadata as pointers. Для различения двух типов в метаданных компилятор Майкрософт C++ применяет этот модификатор к управляемым указателям.To distinguish between the two types in metadata, the Microsoft C++ compiler applies this modifier to managed pointers. Он не создает модификатор для управляемых ссылочных типов.It emits no modifier on managed reference types. Компиляторам необходимо знать правильный синтаксис вызова при импорте метода из области метаданных.Compilers need to know the correct calling syntax when importing a method from metadata scope. Класс и его участник IsImplicitlyDereferenced , класс, неоднозначность ссылочных параметров из параметров указателя. IsExplicitlyDereferencedThe IsExplicitlyDereferenced class and its partner, the IsImplicitlyDereferenced class, disambiguate reference parameters from pointer parameters.

Компиляторы создают пользовательские модификаторы в метаданных, чтобы изменить способ, которым JIT-компилятор обрабатывает значения, если поведение по умолчанию не подходит.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. Когда JIT-компилятор встречает пользовательский модификатор, он обрабатывает значение таким образом, как указывает модификатор.When the JIT compiler encounters a custom modifier, it handles the value in the way that the modifier specifies. Компиляторы могут применять настраиваемые модификаторы к методам, параметрам и возвращаемым значениям.Compilers can apply custom modifiers to methods, parameters, and return values. JIT-компилятор должен реагировать на обязательные модификаторы, но может игнорировать необязательные модификаторы.The JIT compiler must respond to required modifiers but can ignore optional modifiers.

Пользовательские модификаторы можно создавать в метаданных с помощью одного из следующих методов:You can emit custom modifiers into metadata using one of the following techniques:

Применяется к