IsConst クラス


修飾される型に const 修飾子が含まれることを示します。Indicates that the modified type has a const modifier. このクラスは継承できません。This class cannot be inherited.

public ref class IsConst abstract sealed
public static class IsConst
type IsConst = class
Public Class IsConst

次の例は、リフレクションを使用して IsConst オブジェクトをアセンブリに出力する方法を示しています。The following example demonstrates how to emit an IsConst 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
    AssemblyBuilder^ asmBuilder;
    String^ asmName;
    ModuleBuilder^ modBuilder;

    void prepareAssembly(String^ name){
        // Check the input.
            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);


    // Constructor.
    CodeEmitter(String ^ AssemblyName){


    // Create a new type.
    TypeBuilder^ CreateType(String^ name){
        // Check the input.
            throw gcnew ArgumentNullException("AssemblyName");

        return modBuilder->DefineType( name );

    // Write the assembly.
    void WriteAssembly(MethodBuilder^ entryPoint){
        // Check the input.
            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 = {IsConst::typeid};

    mainClass->DefineField("modifiedInteger", Type::GetType("System.Int32"), fType, nullptr, FieldAttributes::Private);

    // Create the type.

    // Write the assembly using a reference to 
    // the entry point.

    Console::WriteLine(L"Assembly created.");


Microsoft C++コンパイラは、ソースコード内で const として宣言されたパラメーター、戻り値の型、またはオブジェクト宣言のメタデータにこの修飾子を出力します。The Microsoft C++ compiler emits this modifier into metadata for any parameter, return type, or object declaration declared as const in the source code.

コンパイラは、既定の動作が適切でない場合にジャストインタイム (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: