Marshal.GetFunctionPointerForDelegate Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
| Имя | Описание |
|---|---|
| GetFunctionPointerForDelegate(Delegate) |
Устаревшие..
Преобразует делегат в указатель функции, вызываемый из неуправляемого кода. |
| GetFunctionPointerForDelegate<TDelegate>(TDelegate) |
Преобразует делегат указанного типа в указатель функции, вызываемый из неуправляемого кода. |
GetFunctionPointerForDelegate(Delegate)
Внимание
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
Преобразует делегат в указатель функции, вызываемый из неуправляемого кода.
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
Параметры
- d
- Delegate
Делегат, передаваемый в неуправляемый код.
Возвращаемое значение
nativeint
Значение, которое можно передать в неуправляемый код, который, в свою очередь, может использовать его для вызова базового управляемого делегата.
- Атрибуты
Исключения
Параметр d является определением универсального типа.
Параметр d имеет значение null.
Динамическое выделение точек входа не поддерживается в текущей среде.
Комментарии
Делегат d преобразуется в указатель функции, который можно передать в неуправляемый код с помощью соглашения о вызовах платформы по умолчанию. Вы можете задать соглашение о вызовах, применяя его к делегату UnmanagedFunctionPointerAttribute .
Необходимо вручную сохранить делегат от сбора сборщиком мусора из управляемого кода. Сборщик мусора не отслеживает ссылки на неуправляемый код. Используйте KeepAlive для предотвращения сбора делегата до завершения собственного вызова:
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, который маршалирует делегат, обрабатывает KeepAlive от имени пользователя:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Если машинный код хранит указатель функции за пределами длительности вызова, корень делегата в течение всего времени существования, например, сохраняя его в static поле.
Этот API не поддерживается в средах, которые не поддерживают динамическое выделение точек входа, например ProcessDynamicCodePolicy на Windows, execmem off в SELinux и WebAssembly.
Вместо этого рекомендуется использовать указатели функций.UnmanagedCallersOnlyAttribute Указатели функций более эффективны, проще использовать правильно и поддерживаются во всех средах.
Применяется к
GetFunctionPointerForDelegate<TDelegate>(TDelegate)
Преобразует делегат указанного типа в указатель функции, вызываемый из неуправляемого кода.
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
Параметры типа
- TDelegate
Тип делегата для преобразования.
Параметры
- d
- TDelegate
Делегат, передаваемый в неуправляемый код.
Возвращаемое значение
nativeint
Значение, которое можно передать в неуправляемый код, который, в свою очередь, может использовать его для вызова базового управляемого делегата.
- Атрибуты
Исключения
Параметр d является определением универсального типа.
Параметр d имеет значение null.
Динамическое выделение точек входа не поддерживается в текущей среде.
Комментарии
Делегат d преобразуется в указатель функции, который можно передать в неуправляемый код с помощью соглашения о вызовах платформы по умолчанию. Вы можете задать соглашение о вызовах, применяя его к делегату UnmanagedFunctionPointerAttribute .
Необходимо вручную сохранить делегат от сбора сборщиком мусора из управляемого кода. Сборщик мусора не отслеживает ссылки на неуправляемый код. Используйте KeepAlive для предотвращения сбора делегата до завершения собственного вызова:
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, который маршалирует делегат, обрабатывает KeepAlive от имени пользователя:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Если машинный код хранит указатель функции за пределами длительности вызова, корень делегата в течение всего времени существования, например, сохраняя его в static поле.
Этот API не поддерживается в средах, которые не поддерживают динамическое выделение точек входа, например ProcessDynamicCodePolicy на Windows, execmem off в SELinux и WebAssembly.
Вместо этого рекомендуется использовать указатели функций.UnmanagedCallersOnlyAttribute Указатели функций более эффективны, проще использовать правильно и поддерживаются во всех средах.