Bagikan melalui


Marshal.GetFunctionPointerForDelegate Metode

Definisi

Overload

Nama Deskripsi
GetFunctionPointerForDelegate(Delegate)
Kedaluwarsa.

Mengonversi delegasi menjadi penunjuk fungsi yang dapat dipanggil dari kode yang tidak dikelola.

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Mengonversi delegasi jenis tertentu ke penunjuk fungsi yang dapat dipanggil dari kode yang tidak dikelola.

GetFunctionPointerForDelegate(Delegate)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Perhatian

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

Mengonversi delegasi menjadi penunjuk fungsi yang dapat dipanggil dari kode yang tidak dikelola.

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

Parameter

d
Delegate

Delegasi yang akan diteruskan ke kode yang tidak dikelola.

Mengembalikan

IntPtr

nativeint

Nilai yang dapat diteruskan ke kode yang tidak dikelola, yang, pada gilirannya, dapat menggunakannya untuk memanggil delegasi terkelola yang mendasar.

Atribut

Pengecualian

Parameter adalah definisi jenis generik.

Parameternya adalah .

Alokasi titik masuk dinamis tidak didukung di lingkungan saat ini.

Keterangan

Delegasi dikonversi ke penunjuk fungsi yang dapat diteruskan ke kode yang tidak dikelola menggunakan konvensi panggilan platform default. Anda dapat mengatur konvensi panggilan dengan menerapkannya ke delegasi.

Anda harus secara manual menjaga delegasi agar tidak dikumpulkan oleh pengumpul sampah dari kode terkelola. Pengumpul sampah tidak melacak referensi ke kode yang tidak dikelola. Gunakan untuk mencegah delegasi dikumpulkan sebelum panggilan asli selesai:

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 yang mendelegasikan delegasi menangani atas nama pengguna:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Jika kode asli menyimpan penunjuk fungsi di luar durasi panggilan, akar delegasi untuk seluruh masa pakainya — misalnya, dengan menyimpannya di bidang.

API ini tidak didukung di lingkungan yang tidak mendukung alokasi titik masuk dinamis, seperti pada Windows, di SELinux, dan WebAssembly.

Disarankan untuk menggunakan penunjuk fungsi dan sebagai gantinya. Penunjuk fungsi lebih efisien, lebih mudah digunakan dengan benar, dan didukung di semua lingkungan.

Berlaku untuk

GetFunctionPointerForDelegate<TDelegate>(TDelegate)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Mengonversi delegasi jenis tertentu ke penunjuk fungsi yang dapat dipanggil dari kode yang tidak dikelola.

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

Jenis parameter

TDelegate

Jenis delegasi yang akan dikonversi.

Parameter

d
TDelegate

Delegasi yang akan diteruskan ke kode yang tidak dikelola.

Mengembalikan

IntPtr

nativeint

Nilai yang dapat diteruskan ke kode yang tidak dikelola, yang, pada gilirannya, dapat menggunakannya untuk memanggil delegasi terkelola yang mendasar.

Atribut

Pengecualian

Parameter adalah definisi jenis generik.

Parameternya adalah .

Alokasi titik masuk dinamis tidak didukung di lingkungan saat ini.

Keterangan

Delegasi dikonversi ke penunjuk fungsi yang dapat diteruskan ke kode yang tidak dikelola dengan menggunakan konvensi panggilan platform default. Anda dapat mengatur konvensi panggilan dengan menerapkannya ke delegasi.

Anda harus secara manual menjaga delegasi agar tidak dikumpulkan oleh pengumpul sampah dari kode terkelola. Pengumpul sampah tidak melacak referensi ke kode yang tidak dikelola. Gunakan untuk mencegah delegasi dikumpulkan sebelum panggilan asli selesai:

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 yang mendelegasikan delegasi menangani atas nama pengguna:

var callback = new MyNativeCallback(MyManagedMethod);
NativeMethod(callback); // P/Invoke marshals the delegate and keeps it alive for the duration of the call.

Jika kode asli menyimpan penunjuk fungsi di luar durasi panggilan, akar delegasi untuk seluruh masa pakainya — misalnya, dengan menyimpannya di bidang.

API ini tidak didukung di lingkungan yang tidak mendukung alokasi titik masuk dinamis, seperti pada Windows, di SELinux, dan WebAssembly.

Disarankan untuk menggunakan penunjuk fungsi dan sebagai gantinya. Penunjuk fungsi lebih efisien, lebih mudah digunakan dengan benar, dan didukung di semua lingkungan.

Berlaku untuk