Condividi tramite


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)

Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs

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);
[System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Marshalling code for the delegate might not be available. Use the GetFunctionPointerForDelegate<TDelegate> overload instead.")]
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
[<System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Marshalling code for the delegate might not be available. Use the GetFunctionPointerForDelegate<TDelegate> overload instead.")>]
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.

Restituisce

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 parametro è una definizione di tipo generico.

Il parametro è .

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

Commenti

Il delegato 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 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 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 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 campo.

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

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

Si applica a

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs

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.

Restituisce

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 parametro è una definizione di tipo generico.

Il parametro è .

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

Commenti

Il delegato 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 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 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 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 campo.

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

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

Si applica a