Marshal.GetFunctionPointerForDelegate Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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)
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
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);
[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
O delegado a ser passado para o código não gerenciado.
Retornos
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 parâmetro é uma definição de tipo genérico.
O parâmetro é .
Não há suporte para alocação dinâmica de ponto de entrada no ambiente atual.
Comentários
O delegado é 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 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 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 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 campo.
Essa API não tem suporte em ambientes que não dão suporte à alocação dinâmica de ponto de entrada, como em Windows, no SELinux e WebAssembly.
É recomendável usar ponteiros de função e , 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)
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
- Origem:
- Marshal.cs
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
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 parâmetro é uma definição de tipo genérico.
O parâmetro é .
Não há suporte para alocação dinâmica de ponto de entrada no ambiente atual.
Comentários
O delegado é 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 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 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 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 campo.
Essa API não tem suporte em ambientes que não dão suporte à alocação dinâmica de ponto de entrada, como em Windows, no SELinux e WebAssembly.
É recomendável usar ponteiros de função e , 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.