Marshal.GetFunctionPointerForDelegate Metodo

Definizione

Overload

Nome Descrizione
GetFunctionPointerForDelegate(Delegate)
Obsoleti.

Converte un delegato in un puntatore a funzione chiamabile da codice non gestito.

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Converte un delegato di un tipo specificato in un puntatore a funzione chiamabile da codice non gestito.

GetFunctionPointerForDelegate(Delegate)

Attenzione

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

Converte un delegato in un puntatore a funzione chiamabile da codice non gestito.

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

Parametri

d
Delegate

Delegato da passare al codice non gestito.

Valori restituiti

IntPtr

nativeint

Valore che può essere passato al codice non gestito, che, a sua volta, può usarlo per chiamare il delegato gestito sottostante.

Attributi

Eccezioni

Il d parametro è una definizione di tipo generico.

Il d parametro è null.

L'allocazione dinamica dei punti di ingresso non è supportata nell'ambiente corrente.

Commenti

Il delegato d viene convertito in un puntatore a funzione che può essere passato al codice non gestito usando la convenzione di chiamata alla piattaforma predefinita. È possibile impostare la convenzione di chiamata applicando al UnmanagedFunctionPointerAttribute delegato.

È necessario impedire manualmente al delegato di essere raccolto dal Garbage Collector dal codice gestito. Il Garbage Collector non tiene traccia dei riferimenti al codice non gestito. Usare KeepAlive per impedire che il delegato venga raccolto prima del completamento della chiamata nativa:

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

P/Invoke che effettua il marshalling di un delegato gestisce l'oggetto KeepAlive per conto dell'utente:

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

Se il codice nativo archivia il puntatore alla funzione oltre la durata della chiamata, radicere il delegato per l'intera durata, ad esempio archiviandolo in un static campo.

Questa API non è supportata in ambienti che non supportano l'allocazione dinamica dei punti di ingresso, ad esempio ProcessDynamicCodePolicy in Windows, execmem off in SELinux e WebAssembly.

È consigliabile usare puntatori a funzione e UnmanagedCallersOnlyAttribute . I puntatori a funzione sono più efficienti, più facili da usare correttamente e supportati in tutti gli ambienti.

Si applica a

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Converte un delegato di un tipo specificato in un puntatore a funzione chiamabile da codice non gestito.

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

Parametri di tipo

TDelegate

Tipo di delegato da convertire.

Parametri

d
TDelegate

Delegato da passare al codice non gestito.

Valori restituiti

IntPtr

nativeint

Valore che può essere passato al codice non gestito, che, a sua volta, può usarlo per chiamare il delegato gestito sottostante.

Attributi

Eccezioni

Il d parametro è una definizione di tipo generico.

Il d parametro è null.

L'allocazione dinamica dei punti di ingresso non è supportata nell'ambiente corrente.

Commenti

Il delegato d viene convertito in un puntatore a funzione che può essere passato al codice non gestito usando la convenzione di chiamata alla piattaforma predefinita. È possibile impostare la convenzione di chiamata applicando al UnmanagedFunctionPointerAttribute delegato.

È necessario impedire manualmente al delegato di essere raccolto dal Garbage Collector dal codice gestito. Il Garbage Collector non tiene traccia dei riferimenti al codice non gestito. Usare KeepAlive per impedire che il delegato venga raccolto prima del completamento della chiamata nativa:

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

P/Invoke che effettua il marshalling di un delegato gestisce l'oggetto KeepAlive per conto dell'utente:

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

Se il codice nativo archivia il puntatore alla funzione oltre la durata della chiamata, radicere il delegato per l'intera durata, ad esempio archiviandolo in un static campo.

Questa API non è supportata in ambienti che non supportano l'allocazione dinamica dei punti di ingresso, ad esempio ProcessDynamicCodePolicy in Windows, execmem off in SELinux e WebAssembly.

È consigliabile usare puntatori a funzione e UnmanagedCallersOnlyAttribute . I puntatori a funzione sono più efficienti, più facili da usare correttamente e supportati in tutti gli ambienti.

Si applica a