Marshal.GetFunctionPointerForDelegate Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Sobrecargas
| Nombre | Description |
|---|---|
| GetFunctionPointerForDelegate(Delegate) |
Obsoletos.
Convierte un delegado en un puntero de función al que se puede llamar desde código no administrado. |
| GetFunctionPointerForDelegate<TDelegate>(TDelegate) |
Convierte un delegado de un tipo especificado en un puntero de función al que se puede llamar desde código no administrado. |
GetFunctionPointerForDelegate(Delegate)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
Precaución
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
Convierte un delegado en un puntero de función al que se puede llamar desde código no administrado.
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
Parámetros
- d
- Delegate
Delegado que se va a pasar al código no administrado.
Devoluciones
nativeint
Valor que se puede pasar al código no administrado, que, a su vez, puede usarlo para llamar al delegado administrado subyacente.
- Atributos
Excepciones
El parámetro es una definición de tipo genérico.
El parámetro es .
La asignación dinámica de puntos de entrada no se admite en el entorno actual.
Comentarios
El delegado se convierte en un puntero de función que se puede pasar al código no administrado mediante la convención de llamada de plataforma predeterminada. Puede establecer la convención de llamada aplicando al delegado.
Debe evitar que el recolector de elementos no utilizados recopile manualmente el delegado del código administrado. El recolector de elementos no utilizados no realiza un seguimiento de las referencias al código no administrado. Use para evitar que el delegado se recopile antes de que se complete la llamada 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 que serializa un delegado controla en nombre del usuario:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Si el código nativo almacena el puntero de función más allá de la duración de la llamada, raíz el delegado durante toda su duración, por ejemplo, almacenándolo en un campo.
Esta API no se admite en entornos que no admiten la asignación dinámica de puntos de entrada, como en Windows, en SELinux y WebAssembly.
Se recomienda usar punteros de función y en su lugar. Los punteros de función son más eficaces, más fáciles de usar correctamente y se admiten en todos los entornos.
Se aplica a
GetFunctionPointerForDelegate<TDelegate>(TDelegate)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
Convierte un delegado de un tipo especificado en un puntero de función al que se puede llamar desde código no administrado.
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
Parámetros de tipo
- TDelegate
Tipo de delegado que se va a convertir.
Parámetros
- d
- TDelegate
Delegado que se va a pasar al código no administrado.
Devoluciones
nativeint
Valor que se puede pasar al código no administrado, que, a su vez, puede usarlo para llamar al delegado administrado subyacente.
- Atributos
Excepciones
El parámetro es una definición de tipo genérico.
El parámetro es .
La asignación dinámica de puntos de entrada no se admite en el entorno actual.
Comentarios
El delegado se convierte en un puntero de función que se puede pasar al código no administrado mediante la convención de llamada de plataforma predeterminada. Puede establecer la convención de llamada aplicando al delegado.
Debe evitar que el recolector de elementos no utilizados recopile manualmente el delegado del código administrado. El recolector de elementos no utilizados no realiza un seguimiento de las referencias al código no administrado. Use para evitar que el delegado se recopile antes de que se complete la llamada 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 que serializa un delegado controla en nombre del usuario:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Si el código nativo almacena el puntero de función más allá de la duración de la llamada, raíz el delegado durante toda su duración, por ejemplo, almacenándolo en un campo.
Esta API no se admite en entornos que no admiten la asignación dinámica de puntos de entrada, como en Windows, en SELinux y WebAssembly.
Se recomienda usar punteros de función y en su lugar. Los punteros de función son más eficaces, más fáciles de usar correctamente y se admiten en todos los entornos.