IsBoxed クラス

定義

修飾されている参照型がボックス化された値型であることを示します。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++コンパイラは、ボックス化された値型を言語で直接サポートします。The Microsoft C++ compiler supports boxed value types directly in the language. ボックス化された値型に関する情報は、カスタム修飾子としてメタデータに出力されます。この修飾子は、ボックス化された値型への参照を装飾します。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:

適用対象