IsExplicitlyDereferenced Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wskazuje, że zarządzany wskaźnik reprezentuje parametr wskaźnika w ramach podpisu metody. Klasa ta nie może być dziedziczona.
public ref class IsExplicitlyDereferenced abstract sealed
public static class IsExplicitlyDereferenced
type IsExplicitlyDereferenced = class
Public Class IsExplicitlyDereferenced
- Dziedziczenie
-
IsExplicitlyDereferenced
Przykłady
W poniższym przykładzie pokazano, jak emitować IsExplicitlyDereferenced obiekt do zestawu przy użyciu odbicia.
#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.");
}
Uwagi
W języku C++zarządzane wskaźniki i odwołania zarządzane są emitowane do metadanych jako wskaźników. Aby odróżnić dwa typy metadanych, kompilator języka Microsoft C++ stosuje ten modyfikator do zarządzanych wskaźników. Nie emituje modyfikatora dla zarządzanych typów odwołań. Kompilatory muszą znać poprawną składnię wywoływania podczas importowania metody z zakresu metadanych. Klasa IsExplicitlyDereferenced i jej partner, IsImplicitlyDereferenced klasa, uściślają parametry referencyjne z parametrów wskaźnika.
Kompilatory emitują niestandardowe modyfikatory w metadanych, aby zmienić sposób, w jaki kompilator just in time (JIT) obsługuje wartości, gdy zachowanie domyślne nie jest odpowiednie. Gdy kompilator JIT napotka modyfikator niestandardowy, obsługuje wartość w sposób określony przez modyfikatora. Kompilatory mogą stosować modyfikatory niestandardowe do metod, parametrów i zwracanych wartości. Kompilator JIT musi reagować na wymagane modyfikatory, ale może ignorować opcjonalne modyfikatory.
Niestandardowe modyfikatory można emitować do metadanych przy użyciu jednej z następujących technik:
Używanie metod w TypeBuilder klasie, takich jak DefineMethod, DefineField, DefineConstructori DefineProperty.
Generowanie pliku instrukcji języka Microsoft Intermediate Language (MSIL), który zawiera wywołania
modopt
imodreq
, i zestawianie pliku za pomocą Ilasm.exe (IL Assembler).Korzystanie z interfejsu API odbicia niezarządzanych.