IsImplicitlyDereferenced Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Označuje, že upravený odkaz na uvolňování paměti představuje referenční parametr v rámci podpisu metody. Tato třída se nemůže dědit.
public ref class IsImplicitlyDereferenced abstract sealed
public static class IsImplicitlyDereferenced
type IsImplicitlyDereferenced = class
Public Class IsImplicitlyDereferenced
- Dědičnost
-
IsImplicitlyDereferenced
Příklady
Následující příklad ukazuje, jak generovat IsImplicitlyDereferenced objekt do sestavení pomocí reflexe.
#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.");
}
Poznámky
Kompilátor jazyka IsImplicitlyDereferenced C++ používá modifikátor k rozlišení referenčních tříd, které jsou předány spravovanými odkazy od tříd předaných spravovaným ukazatelem. Třída IsImplicitlyDereferenced a její partner, IsExplicitlyDereferenced třída, disambiguate referenční parametry z parametrů ukazatele.
Kompilátory generují vlastní modifikátory v metadatech, aby změnily způsob, jakým kompilátor JIT (just-in-time) zpracovává hodnoty, pokud výchozí chování není vhodné. Když kompilátor JIT narazí na vlastní modifikátor, zpracuje hodnotu způsobem, který určuje modifikátor. Kompilátory mohou použít vlastní modifikátory na metody, parametry a návratové hodnoty. Kompilátor JIT musí reagovat na požadované modifikátory, ale může ignorovat volitelné modifikátory.
Vlastní modifikátory můžete do metadat generovat pomocí jedné z následujících technik:
Použití metod ve TypeBuilder třídě, jako DefineMethodje , DefineField, DefineConstructora DefineProperty.
Generování instrukčního souboru Microsoft zprostředkujícího jazyka (MSIL), který obsahuje volání
modoptamodreqa sestavení souboru pomocí Ilasm.exe (IL Assembler).Použití nespravovaného rozhraní API reflexe