Marshal.GetFunctionPointerForDelegate メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オーバーロード
| 名前 | 説明 |
|---|---|
| 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
アンマネージ コードに渡されるデリゲート。
戻り値
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
アンマネージ コードに渡されるデリゲート。
戻り値
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 など、動的なエントリ ポイントの割り当てをサポートしていない環境ではサポートされていません。
代わりに、関数ポインターと を使用することをお勧めします。 関数ポインターは、より効率的で、正しく使いやすく、すべての環境でサポートされています。