IsExplicitlyDereferenced Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Indica que um ponteiro gerido representa um parâmetro de ponteiro dentro de uma assinatura de método. Esta classe não pode ser herdada.
public ref class IsExplicitlyDereferenced abstract sealed
public static class IsExplicitlyDereferenced
type IsExplicitlyDereferenced = class
Public Class IsExplicitlyDereferenced
- Herança
-
IsExplicitlyDereferenced
Exemplos
O exemplo seguinte demonstra como emitir um IsExplicitlyDereferenced objeto numa montagem usando reflexão.
#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 = {IsExplicitlyDereferenced::typeid};
mainClass->DefineField("modifiedInteger", Type::GetType("System.IntPtr"), 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.");
}
Observações
Em C++, ponteiros e referências geridas são emitidos em metadados como ponteiros. Para distinguir entre os dois tipos nos metadados, o compilador Microsoft C++ aplica este modificador a ponteiros geridos. Não emite nenhum modificador nos tipos de referência geridas. Os compiladores precisam de conhecer a sintaxe correta de chamadas ao importar um método a partir do âmbito de metadados. A IsExplicitlyDereferenced classe e a sua parceira, a IsImplicitlyDereferenced classe, desambiguam parâmetros de referência dos parâmetros do apontador.
Os compiladores emitem modificadores personalizados dentro dos metadados para alterar a forma como o compilador just-in-time (JIT) lida com os valores quando o comportamento padrão não é apropriado. Quando o compilador JIT encontra um modificador personalizado, trata o valor da forma que o modificador especifica. Os compiladores podem aplicar modificadores personalizados a métodos, parâmetros e valores de retorno. O compilador JIT deve responder aos modificadores necessários, mas pode ignorar modificadores opcionais.
Pode emitir modificadores personalizados em metadados usando uma das seguintes técnicas:
Usando métodos da TypeBuilder classe como DefineMethod, DefineField, DefineConstructor, e DefineProperty.
Gerar um ficheiro de instruções Microsoft linguagem intermédia (MSIL) que contém chamadas para
modoptemodreq, e montar o ficheiro com o Ilasm.exe (IL Assembler).Usando a API de reflexão não gerida.