Marshal.GetFunctionPointerForDelegate Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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
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
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.