IsImplicitlyDereferenced Класс

Определение

Указывает, что измененная ссылка на сборку мусора представляет ссылочный параметр с сигнатурой метода.Indicates that the modified garbage collection reference represents a reference parameter within a method signature. Этот класс не наследуется.This class cannot be inherited.

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

Примеры

В следующем примере показано, как выдать IsImplicitlyDereferenced объект в сборку с помощью отражения.The following example demonstrates how to emit an IsImplicitlyDereferenced 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 = {IsImplicitlyDereferenced::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++ Компилятор использует IsImplicitlyDereferenced модификатор для различения ссылочных классов, передаваемых управляемой ссылкой из тех, которые передаются управляемым указателем.The C++ compiler uses the IsImplicitlyDereferenced modifier to distinguish reference classes that are passed by managed reference from those passed by managed pointer. Класс и его участник IsExplicitlyDereferenced , класс, неоднозначность ссылочных параметров из параметров указателя. IsImplicitlyDereferencedThe IsImplicitlyDereferenced class and its partner, the IsExplicitlyDereferenced 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:

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