Marshal.GetFunctionPointerForDelegate Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Přetížení
| Name | Description |
|---|---|
| GetFunctionPointerForDelegate(Delegate) |
Zastaralé.
Převede delegáta na ukazatel funkce, který lze volat z nespravovaného kódu. |
| GetFunctionPointerForDelegate<TDelegate>(TDelegate) |
Převede delegáta zadaného typu na ukazatel funkce, který je volán z nespravovaného kódu. |
GetFunctionPointerForDelegate(Delegate)
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
Upozornění
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
Převede delegáta na ukazatel funkce, který lze volat z nespravovaného kódu.
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
Parametry
- d
- Delegate
Delegát, který se má předat nespravovanému kódu.
Návraty
nativeint
Hodnota, která se dá předat nespravovanému kódu, který pak může použít k volání základního spravovaného delegáta.
- Atributy
Výjimky
Parametr je definice obecného typu.
Parametr je .
Dynamické přidělování vstupních bodů se v aktuálním prostředí nepodporuje.
Poznámky
Delegát je převeden na ukazatel funkce, který lze předat nespravovanému kódu pomocí výchozí konvence volání platformy. Konvenci volání můžete nastavit použitím delegáta.
Delegáta musíte ručně ponechat v shromažďování paměti ze spravovaného kódu. Systém uvolňování paměti nesleduje odkazy na nespravovaný kód. Slouží k zabránění shromažďování delegáta před dokončením nativního volání:
var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.
Volání nespravovaného kódu, které zařazuje delegáta za uživatele:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Pokud nativní kód ukládá ukazatel funkce nad rámec doby trvání volání, zakořte delegáta po celou dobu životnosti – například uložením do pole.
Toto rozhraní API není podporováno v prostředích, která nepodporují dynamické přidělování vstupních bodů, jako je na Windows, v SELinuxu a WebAssembly.
Doporučuje se používat ukazatele na funkce a místo toho. Ukazatele funkcí jsou efektivnější, snadněji se používají správně a podporují ve všech prostředích.
Platí pro
GetFunctionPointerForDelegate<TDelegate>(TDelegate)
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
- Zdroj:
- Marshal.cs
Převede delegáta zadaného typu na ukazatel funkce, který je volán z nespravovaného kódu.
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
Parametry typu
- TDelegate
Typ delegáta, který chcete převést.
Parametry
- d
- TDelegate
Delegát, který se má předat nespravovanému kódu.
Návraty
nativeint
Hodnota, která se dá předat nespravovanému kódu, který pak může použít k volání základního spravovaného delegáta.
- Atributy
Výjimky
Parametr je definice obecného typu.
Parametr je .
Dynamické přidělování vstupních bodů se v aktuálním prostředí nepodporuje.
Poznámky
Delegát je převeden na ukazatel funkce, který lze předat nespravovanému kódu pomocí výchozí konvence volání platformy. Konvenci volání můžete nastavit použitím delegáta.
Delegáta musíte ručně ponechat v shromažďování paměti ze spravovaného kódu. Systém uvolňování paměti nesleduje odkazy na nespravovaný kód. Slouží k zabránění shromažďování delegáta před dokončením nativního volání:
var callback = new MyNativeCallback(MyManagedMethod);
IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(callback);
NativeMethod(fnPtr);
GC.KeepAlive(callback); // Prevent collection — fnPtr does not root the delegate.
Volání nespravovaného kódu, které zařazuje delegáta za uživatele:
var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.
Pokud nativní kód ukládá ukazatel funkce nad rámec doby trvání volání, zakořte delegáta po celou dobu životnosti – například uložením do pole.
Toto rozhraní API není podporováno v prostředích, která nepodporují dynamické přidělování vstupních bodů, jako je na Windows, v SELinuxu a WebAssembly.
Doporučuje se používat ukazatele na funkce a místo toho. Ukazatele funkcí jsou efektivnější, snadněji se používají správně a podporují ve všech prostředích.