Marshal.GetFunctionPointerForDelegate Metódus

Definíció

Túlterhelések

Name Description
GetFunctionPointerForDelegate(Delegate)
Elavult.

A meghatalmazottat nem felügyelt kódból hívható függvénymutatóvá alakítja.

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Egy megadott típusú meghatalmazottat nem felügyelt kódból hívható függvénymutatóvá alakít át.

GetFunctionPointerForDelegate(Delegate)

Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs

Figyelemfelhívás

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

A meghatalmazottat nem felügyelt kódból hívható függvénymutatóvá alakítja.

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

Paraméterek

d
Delegate

A nem felügyelt kódnak átadni kívánt meghatalmazott.

Válaszok

IntPtr

nativeint

Nem felügyelt kódnak átadható érték, amely a mögöttes felügyelt meghatalmazott meghívására használható.

Attribútumok

Kivételek

A d paraméter egy általános típusdefiníció.

A d paraméter a következő null: .

A dinamikus belépésipont-foglalás az aktuális környezetben nem támogatott.

Megjegyzések

A meghatalmazott d egy függvénymutatóvá alakul, amely az alapértelmezett platformhívási konvencióval továbbítható nem felügyelt kódnak. A hívási konvenciót úgy állíthatja be, hogy alkalmazza a UnmanagedFunctionPointerAttribute meghatalmazottra.

Manuálisan meg kell őriznie, hogy a delegáltat a szemétgyűjtő gyűjtse össze a felügyelt kódból. A szemétgyűjtő nem követi nyomon a nem felügyelt kódra mutató hivatkozásokat. A használatával KeepAlive megakadályozhatja, hogy a meghatalmazott a natív hívás befejeződése előtt összegyűjtse a következőt:

var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.

A meghatalmazottat felügyelő P/Invoke a felhasználó nevében kezeli a KeepAlive következőt:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Ha a natív kód a függvénymutatót a hívás időtartamán túl tárolja, a delegáltat a teljes élettartama alatt gyökereztetheti – például egy static mezőben tárolva.

Ez az API nem támogatott olyan környezetekben, amelyek nem támogatják a dinamikus belépési pontok lefoglalását, például ProcessDynamicCodePolicy Windows, execmem off SELinux-ban és WebAssembly-en.

Célszerű inkább függvénymutatókat UnmanagedCallersOnlyAttribute használni. A függvénymutatók hatékonyabbak, könnyebben használhatók, és minden környezetben támogatottak.

A következőre érvényes:

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs
Forrás:
Marshal.cs

Egy megadott típusú meghatalmazottat nem felügyelt kódból hívható függvénymutatóvá alakít át.

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

Típusparaméterek

TDelegate

Az átalakítandó meghatalmazott típusa.

Paraméterek

d
TDelegate

A nem felügyelt kódnak átadni kívánt meghatalmazott.

Válaszok

IntPtr

nativeint

Nem felügyelt kódnak átadható érték, amely a mögöttes felügyelt meghatalmazott meghívására használható.

Attribútumok

Kivételek

A d paraméter egy általános típusdefiníció.

A d paraméter a következő null: .

A dinamikus belépésipont-foglalás az aktuális környezetben nem támogatott.

Megjegyzések

A delegált d egy függvénymutatóvá alakul, amely az alapértelmezett platformhívási konvencióval továbbítható nem felügyelt kódnak. A hívási konvenciót úgy állíthatja be, hogy alkalmazza a UnmanagedFunctionPointerAttribute meghatalmazottra.

Manuálisan meg kell őriznie, hogy a delegáltat a szemétgyűjtő gyűjtse össze a felügyelt kódból. A szemétgyűjtő nem követi nyomon a nem felügyelt kódra mutató hivatkozásokat. A használatával KeepAlive megakadályozhatja, hogy a meghatalmazott a natív hívás befejeződése előtt összegyűjtse a következőt:

var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.

A meghatalmazottat felügyelő P/Invoke a felhasználó nevében kezeli a KeepAlive következőt:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Ha a natív kód a függvénymutatót a hívás időtartamán túl tárolja, a delegáltat a teljes élettartama alatt gyökereztetheti – például egy static mezőben tárolva.

Ez az API nem támogatott olyan környezetekben, amelyek nem támogatják a dinamikus belépési pontok lefoglalását, például ProcessDynamicCodePolicy Windows, execmem off SELinux-ban és WebAssembly-en.

Célszerű inkább függvénymutatókat UnmanagedCallersOnlyAttribute használni. A függvénymutatók hatékonyabbak, könnyebben használhatók, és minden környezetben támogatottak.

A következőre érvényes: