Sdílet prostřednictvím


Marshal.GetFunctionPointerForDelegate Metoda

Definice

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

IntPtr

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

IntPtr

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