Marshal.GetFunctionPointerForDelegate Yöntem

Tanım

Aşırı Yüklemeler

Name Description
GetFunctionPointerForDelegate(Delegate)
Geçersiz.

Bir temsilciyi yönetilmeyen koddan çağrılabilen bir işlev işaretçisine dönüştürür.

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Belirtilen türde bir temsilciyi yönetilmeyen koddan çağrılabilen bir işlev işaretçisine dönüştürür.

GetFunctionPointerForDelegate(Delegate)

Dikkat

GetFunctionPointerForDelegate(Delegate) may be unavailable in future releases. Instead, use GetFunctionPointerForDelegate<T>(T). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296522

Bir temsilciyi yönetilmeyen koddan çağrılabilen bir işlev işaretçisine dönüştürür.

public:
 static IntPtr GetFunctionPointerForDelegate(Delegate ^ d);
[System.Obsolete("GetFunctionPointerForDelegate(Delegate) may be unavailable in future releases. Instead, use GetFunctionPointerForDelegate<T>(T). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296522")]
[System.Security.SecurityCritical]
public static IntPtr GetFunctionPointerForDelegate(Delegate d);
public static IntPtr GetFunctionPointerForDelegate(Delegate d);
[System.Security.SecurityCritical]
public static IntPtr GetFunctionPointerForDelegate(Delegate d);
[<System.Obsolete("GetFunctionPointerForDelegate(Delegate) may be unavailable in future releases. Instead, use GetFunctionPointerForDelegate<T>(T). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296522")>]
[<System.Security.SecurityCritical>]
static member GetFunctionPointerForDelegate : Delegate -> nativeint
static member GetFunctionPointerForDelegate : Delegate -> nativeint
[<System.Security.SecurityCritical>]
static member GetFunctionPointerForDelegate : Delegate -> nativeint
Public Shared Function GetFunctionPointerForDelegate (d As Delegate) As IntPtr

Parametreler

d
Delegate

Yönetilmeyen koda geçirilecek temsilci.

Döndürülenler

IntPtr

nativeint

Yönetilmeyen koda geçirilebilen ve bunu kullanarak temel alınan yönetilen temsilciyi çağırabilen bir değer.

Öznitelikler

Özel durumlar

d parametresi genel bir tür tanımıdır.

d parametresi null'dir.

Dinamik giriş noktası ayırma geçerli ortamda desteklenmiyor.

Açıklamalar

Temsilci d , varsayılan platform çağırma kuralı kullanılarak yönetilmeyen koda geçirilebilen bir işlev işaretçisine dönüştürülür. çağrısı kuralını, öğesini temsilciye uygulayarak UnmanagedFunctionPointerAttribute ayarlayabilirsiniz.

Temsilcinin, yönetilen koddan çöp toplayıcı tarafından toplanmasını el ile tutmanız gerekir. Çöp toplayıcı yönetilmeyen kod başvurularını izlemez. Yerel çağrı tamamlanmadan önce temsilcinin toplanmasını önlemek için kullanın KeepAlive :

var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.

Bir temsilciyi sıralayan ve kullanıcı adına işleyebilen KeepAlive bir P/Invoke:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Yerel kod işlev işaretçisini çağrı süresinin ötesinde depolarsa, temsilciyi tüm ömrü boyunca (örneğin, bir static alanda depolayarak) kök oluşturun.

Bu API, Windows üzerinde ProcessDynamicCodePolicy, SELinux'ta execmem off ve WebAssembly gibi dinamik giriş noktası ayırmayı desteklemeyen ortamlarda desteklenmez.

bunun yerine işlev işaretçilerinin UnmanagedCallersOnlyAttribute kullanılması önerilir. İşlev işaretçileri daha verimlidir, doğru kullanımı daha kolaydır ve tüm ortamlarda desteklenir.

Şunlara uygulanır

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Belirtilen türde bir temsilciyi yönetilmeyen koddan çağrılabilen bir işlev işaretçisine dönüştürür.

public:
generic <typename TDelegate>
 static IntPtr GetFunctionPointerForDelegate(TDelegate d);
[System.Security.SecurityCritical]
public static IntPtr GetFunctionPointerForDelegate<TDelegate>(TDelegate d);
public static IntPtr GetFunctionPointerForDelegate<TDelegate>(TDelegate d);
[<System.Security.SecurityCritical>]
static member GetFunctionPointerForDelegate : 'Delegate -> nativeint
static member GetFunctionPointerForDelegate : 'Delegate -> nativeint
Public Shared Function GetFunctionPointerForDelegate(Of TDelegate) (d As TDelegate) As IntPtr

Tür Parametreleri

TDelegate

Dönüştürülecek temsilcinin türü.

Parametreler

d
TDelegate

Yönetilmeyen koda geçirilecek temsilci.

Döndürülenler

IntPtr

nativeint

Yönetilmeyen koda geçirilebilen ve bunu kullanarak temel alınan yönetilen temsilciyi çağırabilen bir değer.

Öznitelikler

Özel durumlar

d parametresi genel bir tür tanımıdır.

d parametresi null'dir.

Dinamik giriş noktası ayırma geçerli ortamda desteklenmiyor.

Açıklamalar

Temsilci d , varsayılan platform çağırma kuralı kullanılarak yönetilmeyen koda geçirilebilen bir işlev işaretçisine dönüştürülür. çağrısı kuralını, öğesini temsilciye uygulayarak UnmanagedFunctionPointerAttribute ayarlayabilirsiniz.

Temsilcinin, yönetilen koddan çöp toplayıcı tarafından toplanmasını el ile tutmanız gerekir. Çöp toplayıcı yönetilmeyen kod başvurularını izlemez. Yerel çağrı tamamlanmadan önce temsilcinin toplanmasını önlemek için kullanın KeepAlive :

var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.

Bir temsilciyi sıralayan ve kullanıcı adına işleyebilen KeepAlive bir P/Invoke:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Yerel kod işlev işaretçisini çağrı süresinin ötesinde depolarsa, temsilciyi tüm ömrü boyunca (örneğin, bir static alanda depolayarak) kök oluşturun.

Bu API, Windows üzerinde ProcessDynamicCodePolicy, SELinux'ta execmem off ve WebAssembly gibi dinamik giriş noktası ayırmayı desteklemeyen ortamlarda desteklenmez.

bunun yerine işlev işaretçilerinin UnmanagedCallersOnlyAttribute kullanılması önerilir. İşlev işaretçileri daha verimlidir, doğru kullanımı daha kolaydır ve tüm ortamlarda desteklenir.

Şunlara uygulanır