IsImplicitlyDereferenced Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Indica che il riferimento di Garbage Collection modificato rappresenta un parametro di riferimento all'interno di una firma del metodo. La classe non può essere ereditata.
public ref class IsImplicitlyDereferenced abstract sealed
public static class IsImplicitlyDereferenced
type IsImplicitlyDereferenced = class
Public Class IsImplicitlyDereferenced
- Ereditarietà
-
IsImplicitlyDereferenced
Esempio
Nell'esempio seguente viene illustrato come generare un IsImplicitlyDereferenced oggetto in un assembly usando la 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
{
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 = {IsImplicitlyDereferenced::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.");
}
Commenti
Il compilatore C++ usa il IsImplicitlyDereferenced modificatore per distinguere le classi di riferimento passate dal riferimento gestito da quelle passate dal puntatore gestito. La IsImplicitlyDereferenced classe e il relativo partner, la IsExplicitlyDereferenced classe , disambiguano i parametri di riferimento dai parametri del puntatore.
I compilatori generano modificatori personalizzati all'interno dei metadati per modificare il modo in cui il compilatore JIT gestisce i valori quando il comportamento predefinito non è appropriato. Quando il compilatore JIT rileva un modificatore personalizzato, gestisce il valore nel modo specificato dal modificatore. I compilatori possono applicare modificatori personalizzati a metodi, parametri e valori restituiti. Il compilatore JIT deve rispondere ai modificatori necessari, ma può ignorare i modificatori facoltativi.
È possibile generare modificatori personalizzati nei metadati usando una delle tecniche seguenti:
Uso di metodi nella TypeBuilder classe, DefineMethodad esempio , DefineField, DefineConstructore DefineProperty.
Generazione di un file di istruzioni MSIL (Microsoft Intermediate Language) che contiene le chiamate a
modopt
emodreq
e e l'assemblaggio del file con l'assembler ilIlasm.exe (L Assembler).Uso dell'API reflection non gestita.