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) 指令文件,其中包含对
modopt
和modreq
的调用,并使用 Ilasm.exe (IL 汇编程序) 汇编文件。使用非托管反射 API。