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++ 개체 반환 의미 체계가 있는 메서드의 반환 형식을 표시하는 데 사용됩니다. 관리되는 디버거는 이 한정자를 인식하여 네이티브 호출 규칙이 사용되고 있는지 올바르게 확인합니다.
컴파일러는 적시에 (JIT) 컴파일러가 기본 동작이 적절 하지 않은 경우 값을 처리 하는 방법을 변경 하려면 메타 데이터 내에서 사용자 지정 한정자를 내보냅니다. JIT 컴파일러는 사용자 지정 한정자를 발견 하는 경우에 한정자를 지정 하는 방식으로 값을 처리 합니다. 컴파일러는 메서드, 매개 변수를 사용자 지정 한정자를 적용 하 고 값을 반환할 수 있습니다. JIT 컴파일러는 필수 한정자에 응답 해야 하지만 선택적 한정자를 무시할 수 있습니다.
다음 방법 중 하나를 사용 하 여 메타 데이터를 사용자 지정 한정자를 내보낼 수 있습니다.
메서드를 사용 하는 TypeBuilder 와 같은 클래스 DefineMethod를 DefineField, DefineConstructor, 및 DefineProperty합니다.
에 대 한 호출을 포함 하는 Microsoft MSIL (intermediate language) 명령 파일을 생성
modopt
및modreq
, 및 어셈블 사용 하 여 파일을 Ilasm.exe (IL 어셈블러)합니다.관리 되지 않는 리플렉션 API를 사용합니다.
적용 대상
.NET