IsBoxed 클래스

정의

수정 된 참조 형식이 boxed 값 형식임을 나타냅니다.Indicates that the modified reference type is a boxed value type. 이 클래스는 상속될 수 없습니다.This class cannot be inherited.

public ref class IsBoxed abstract sealed
public static class IsBoxed
type IsBoxed = class
Public Class IsBoxed
상속
IsBoxed

예제

다음 예제에서는 내보내는 방법을 보여 줍니다는 IsBoxed 리플렉션을 사용 하 여 어셈블리에는 개체입니다.The following example demonstrates how to emit an IsBoxed 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 = {IsBoxed::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.");
}

설명

Microsoft c + + 컴파일러는 boxed 값 형식 언어로 직접 지원합니다.The Microsoft C++ compiler supports boxed value types directly in the language. Boxed 값 형식에 대 한 정보는 한정자 되 boxed 값 형식에 대 한 참조를 장식 하는 위치 하는 사용자 지정 한정자를 메타 데이터로 내보내집니다.Information about boxed value types is emitted into metadata as a custom modifier, where the modifier decorates a reference to the value type being boxed.

컴파일러는 적시에 (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:

적용 대상