IsExplicitlyDereferenced 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示 Managed 指標會表示方法簽章內的指標參數。 此類別無法獲得繼承。
public ref class IsExplicitlyDereferenced abstract sealed
public static class IsExplicitlyDereferenced
type IsExplicitlyDereferenced = class
Public Class IsExplicitlyDereferenced
- 繼承
-
IsExplicitlyDereferenced
範例
下列範例示範如何使用反映,將對象發出 IsExplicitlyDereferenced 至元件。
#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.");
}
備註
在 C++ 中,Managed 指標和 Managed 參考會以指標的形式發出至元數據。 為了區分元數據中的兩種類型,Microsoft C++ 編譯程式會將此修飾詞套用至 Managed 指標。 它會在 Managed 參考型別上發出任何修飾詞。 從元數據範圍匯入方法時,編譯程式必須知道正確的呼叫語法。 類別 IsExplicitlyDereferenced 及其夥伴 IsImplicitlyDereferenced 類別會釐清指標參數的參考參數。
編譯程式會在元數據內發出自定義修飾詞,以變更當預設行為不正確時,Just-In-Time (JIT) 編譯程式處理值的方式。 當 JIT 編譯程式遇到自定義修飾詞時,它會以修飾詞指定的方式處理值。 編譯程式可以將自定義修飾詞套用至方法、參數和傳回值。 JIT 編譯程式必須回應必要的修飾詞,但可以忽略選擇性修飾詞。
您可以使用下列其中一種技術,將自訂修飾詞發出至元數據:
在類別中使用 TypeBuilder 方法,例如 DefineMethod、 DefineField、 DefineConstructor和 DefineProperty。
產生 Microsoft 中繼語言 (MSIL) 指令檔,其中包含 對 和
modreq
的呼叫modopt
,並使用 Ilasm.exe (IL 組合器) 來組合檔案。使用 Unmanaged 反映 API。