Marshal.GetFunctionPointerForDelegate Método

Definição

Sobrecargas

Nome Description
GetFunctionPointerForDelegate(Delegate)
Obsoleto.

Converte um delegado em um ponteiro de função que pode ser chamado de código não gerenciado.

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Converte um delegado de um tipo especificado em um ponteiro de função que pode ser chamado de código não gerenciado.

GetFunctionPointerForDelegate(Delegate)

Cuidado

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 um delegado em um ponteiro de função que pode ser chamado de código não gerenciado.

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

O delegado a ser passado para o código não gerenciado.

Retornos

IntPtr

nativeint

Um valor que pode ser passado para código não gerenciado, que, por sua vez, pode usá-lo para chamar o delegado gerenciado subjacente.

Atributos

Exceções

O d parâmetro é uma definição de tipo genérico.

O d parâmetro é null.

Não há suporte para alocação dinâmica de ponto de entrada no ambiente atual.

Comentários

O delegado d é convertido em um ponteiro de função que pode ser passado para código não gerenciado usando a convenção de chamada de plataforma padrão. Você pode definir a convenção de chamada aplicando-a UnmanagedFunctionPointerAttribute ao delegado.

Você deve impedir manualmente que o delegado seja coletado pelo coletor de lixo do código gerenciado. O coletor de lixo não rastreia referências a código não gerenciado. Use KeepAlive para impedir que o delegado seja coletado antes que a chamada nativa seja concluída:

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

Um P/Invoke que faz marshaling de um delegado manipula o KeepAlive em nome do usuário:

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

Se o código nativo armazenar o ponteiro de função além da duração da chamada, enraize o delegado durante todo o tempo de vida , por exemplo, armazenando-o em um static campo.

Essa API não tem suporte em ambientes que não dão suporte à alocação dinâmica de ponto de entrada, como ProcessDynamicCodePolicy em Windows, execmem off no SELinux e WebAssembly.

É recomendável usar ponteiros de função e UnmanagedCallersOnlyAttribute , em vez disso. Os ponteiros de função são mais eficientes, mais fáceis de usar corretamente e compatíveis em todos os ambientes.

Aplica-se a

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Converte um delegado de um tipo especificado em um ponteiro de função que pode ser chamado de código não gerenciado.

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

O tipo de delegado a ser convertido.

Parâmetros

d
TDelegate

O delegado a ser passado para o código não gerenciado.

Retornos

IntPtr

nativeint

Um valor que pode ser passado para código não gerenciado, que, por sua vez, pode usá-lo para chamar o delegado gerenciado subjacente.

Atributos

Exceções

O d parâmetro é uma definição de tipo genérico.

O d parâmetro é null.

Não há suporte para alocação dinâmica de ponto de entrada no ambiente atual.

Comentários

O delegado d é convertido em um ponteiro de função que pode ser passado para código não gerenciado usando a convenção de chamada de plataforma padrão. Você pode definir a convenção de chamada aplicando-a UnmanagedFunctionPointerAttribute ao delegado.

Você deve impedir manualmente que o delegado seja coletado pelo coletor de lixo do código gerenciado. O coletor de lixo não rastreia referências a código não gerenciado. Use KeepAlive para impedir que o delegado seja coletado antes que a chamada nativa seja concluída:

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

Um P/Invoke que faz marshaling de um delegado manipula o KeepAlive em nome do usuário:

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

Se o código nativo armazenar o ponteiro de função além da duração da chamada, enraize o delegado durante todo o tempo de vida , por exemplo, armazenando-o em um static campo.

Essa API não tem suporte em ambientes que não dão suporte à alocação dinâmica de ponto de entrada, como ProcessDynamicCodePolicy em Windows, execmem off no SELinux e WebAssembly.

É recomendável usar ponteiros de função e UnmanagedCallersOnlyAttribute , em vez disso. Os ponteiros de função são mais eficientes, mais fáceis de usar corretamente e compatíveis em todos os ambientes.

Aplica-se a