IsUdtReturn クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
戻り値の型がユーザー定義型であることを示します。 このクラスは継承できません。
public ref class IsUdtReturn abstract sealed
public static class IsUdtReturn
type IsUdtReturn = class
Public Class IsUdtReturn
- 継承
-
IsUdtReturn
例
次のコード例では、 名前空間のクラスを使用してアセンブリを System.Reflection.Emit 作成し、 修飾子を IsUdtReturn そのアセンブリに出力します。
#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 _tmain()
{
// Create a CodeEmitter to handle assembly creation.
CodeEmitter ^ e = gcnew CodeEmitter("programAssem.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 = {IsUdtReturn::typeid};
mainClass->DefineField("modifiedInteger", Type::GetType("System.Type"), 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.");
}
注釈
修飾子は IsUdtReturn 、ネイティブ C++ オブジェクトの戻りセマンティクスを持つメソッドの戻り値の型をマークするために C++ コンパイラによって使用されます。 マネージド デバッガーは、この修飾子を認識して、ネイティブ呼び出し規則が使用されていることを正しく判断します。
コンパイラはメタデータ内でカスタム修飾子を生成し、既定の動作が適切でない場合に Just-In-Time (JIT) コンパイラが値を処理する方法を変更します。 JIT コンパイラは、カスタム修飾子を検出すると、修飾子が指定する方法で値を処理します。 コンパイラは、カスタム修飾子をメソッド、パラメーター、および戻り値に適用できます。 JIT コンパイラは必要な修飾子に応答する必要がありますが、省略可能な修飾子は無視できます。
次のいずれかの手法を使用して、カスタム修飾子をメタデータに出力できます。
、、 などのDefineConstructorDefineMethodDefineFieldクラスのTypeBuilderメソッドを使用する。DefineProperty
および の呼び出し
modopt
を含む Microsoft 中間言語 (MSIL) 命令ファイルを生成し、Ilasm.exe (IL アセンブラー) を使用してファイルをアセンブルします。modreq
アンマネージド リフレクション API の使用。
適用対象
.NET