Бөлісу құралы:


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

Делегат, передаваемый в неуправляемый код.

Возвращаемое значение

IntPtr

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

Делегат, передаваемый в неуправляемый код.

Возвращаемое значение

IntPtr

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.

Вместо этого рекомендуется использовать указатели функций. Указатели функций более эффективны, проще использовать правильно и поддерживаются во всех средах.

Применяется к