次の方法で共有


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 など、動的なエントリ ポイントの割り当てをサポートしていない環境ではサポートされていません。

代わりに、関数ポインターと を使用することをお勧めします。 関数ポインターは、より効率的で、正しく使いやすく、すべての環境でサポートされています。

適用対象