Marshal.GetFunctionPointerForDelegate Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
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
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
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.