Marshal.GetFunctionPointerForDelegate Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Sobrecargas
| Name | Description |
|---|---|
| GetFunctionPointerForDelegate(Delegate) |
Obsoleto.
Converte um delegado num ponteiro de função que pode ser chamado a partir de código não gerido. |
| GetFunctionPointerForDelegate<TDelegate>(TDelegate) |
Converte um delegado de um tipo especificado num ponteiro de função que pode ser chamado a partir de código não gerido. |
GetFunctionPointerForDelegate(Delegate)
Atenção
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 num ponteiro de função que pode ser chamado a partir de código não gerido.
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 código não gerido.
Devoluções
nativeint
Um valor que pode ser passado para código não gerido, que, por sua vez, pode usá-lo para chamar o delegado gerido subjacente.
- Atributos
Exceções
O d parâmetro é uma definição de tipo genérica.
O d parâmetro é null.
A alocação dinâmica de pontos de entrada não é suportada no ambiente atual.
Observações
O delegado é convertido num ponteiro de função que pode ser passado para código não gerido usando a convenção padrão ded chamada de plataforma. Pode definir a convenção de chamada aplicando o UnmanagedFunctionPointerAttribute ao delegado.
Tem de evitar manualmente que o delegado seja recolhido pelo coletor de lixo através do código gerido. O coletor de lixo não regista referências a código não gerido. Use KeepAlive para evitar que o delegado seja recolhido antes da chamada nativa terminar:
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 organiza um delegado trata do KeepAlive em nome do utilizador:
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 para além da duração da chamada, root o delegado durante toda a sua vida útil — por exemplo, armazenando-o num static campo.
Esta API não é suportada em ambientes que não suportam alocação dinâmica de pontos de entrada, como ProcessDynamicCodePolicy no Windows, execmem off no SELinux e WebAssembly.
Recomenda-se 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 suportados em todos os ambientes.
Aplica-se a
GetFunctionPointerForDelegate<TDelegate>(TDelegate)
Converte um delegado de um tipo especificado num ponteiro de função que pode ser chamado a partir de código não gerido.
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 Genérico
- TDelegate
O tipo de delegado a converter.
Parâmetros
- d
- TDelegate
O delegado a ser passado para código não gerido.
Devoluções
nativeint
Um valor que pode ser passado para código não gerido, que, por sua vez, pode usá-lo para chamar o delegado gerido subjacente.
- Atributos
Exceções
O d parâmetro é uma definição de tipo genérica.
O d parâmetro é null.
A alocação dinâmica de pontos de entrada não é suportada no ambiente atual.
Observações
O delegado é convertido num ponteiro de função que pode ser passado para código não gerido usando a convenção padrão ded chamada de plataforma. Pode definir a convenção de chamada aplicando o UnmanagedFunctionPointerAttribute ao delegado.
Tem de evitar manualmente que o delegado seja recolhido pelo coletor de lixo através do código gerido. O coletor de lixo não regista referências a código não gerido. Use KeepAlive para evitar que o delegado seja recolhido antes da chamada nativa terminar:
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 organiza um delegado trata do KeepAlive em nome do utilizador:
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 para além da duração da chamada, root o delegado durante toda a sua vida útil — por exemplo, armazenando-o num static campo.
Esta API não é suportada em ambientes que não suportam alocação dinâmica de pontos de entrada, como ProcessDynamicCodePolicy no Windows, execmem off no SELinux e WebAssembly.
Recomenda-se 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 suportados em todos os ambientes.