Marshal.GetFunctionPointerForDelegate Método

Definición

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)

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);
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

Parámetros

d
Delegate

Delegado que se va a pasar al código no administrado.

Devoluciones

IntPtr

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 d parámetro es una definición de tipo genérico.

El d parámetro es null.

La asignación dinámica de puntos de entrada no se admite en el entorno actual.

Comentarios

El delegado d 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 UnmanagedFunctionPointerAttribute 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 KeepAlive 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 KeepAlive 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 static campo.

Esta API no se admite en entornos que no admiten la asignación dinámica de puntos de entrada, como ProcessDynamicCodePolicy en Windows, execmem off en SELinux y WebAssembly.

Se recomienda usar punteros de función y UnmanagedCallersOnlyAttribute 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)

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

IntPtr

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 d parámetro es una definición de tipo genérico.

El d parámetro es null.

La asignación dinámica de puntos de entrada no se admite en el entorno actual.

Comentarios

El delegado d 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 UnmanagedFunctionPointerAttribute 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 KeepAlive 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 KeepAlive 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 static campo.

Esta API no se admite en entornos que no admiten la asignación dinámica de puntos de entrada, como ProcessDynamicCodePolicy en Windows, execmem off en SELinux y WebAssembly.

Se recomienda usar punteros de función y UnmanagedCallersOnlyAttribute 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