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