Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a minta bemutatja, hogyan adhat át delegáltakat egy nem felügyelt függvénynek, amely függvénymutatókat vár. A meghatalmazott olyan osztály, amely hivatkozhat egy metódusra, és egyenértékű egy típusbiztos függvénymutatóval vagy egy visszahívási függvénnyel.
Megjegyzés:
Amikor egy híváson belül használ egy delegáltat, a közös nyelvi futtatókörnyezet megvédi a delegáltat attól, hogy a hívás időtartama alatt eltávolítsa a memóriából a szemétgyűjtő. Ha azonban a nem felügyelt függvény a hívás befejezése után tárolja a használni kívánt delegáltat, manuálisan meg kell akadályoznia a szemétgyűjtést, amíg a nem felügyelt függvény nem fejeződik be a meghatalmazottal. További információkért tekintse meg a HandleRef-mintát és a GCHandle-mintát.
A visszahívási minta a következő nem felügyelt függvényeket használja, amelyek az eredeti függvénydeklarációjukkal jelennek meg:
TestCallBackPinvokeLib.dllki lett exportálva.void TestCallBack(FPTR pf, int value);TestCallBack2PinvokeLib.dllki lett exportálva.void TestCallBack2(FPTR2 pf2, char* value);
PinvokeLib.dll egy egyéni, nem felügyelt kódtár, amely a korábban felsorolt függvények implementációját tartalmazza.
Ebben a mintában az NativeMethods osztály kezelt prototípusokat tartalmaz a TestCallBack és TestCallBack2 módszerekhez. Mindkét metódus átad egy delegáltat egy visszahívási függvénynek paraméterként. A meghatalmazott aláírásának meg kell egyeznie a hivatkozott metódus aláírásával. A FPtr és FPtr2 delegátumok például olyan aláírásokkal rendelkeznek, amelyek megegyeznek a DoSomething és DoSomething2 metódusok aláírásával.
Prototípusok deklarálása
public delegate bool FPtr(int value);
public delegate bool FPtr2(String^ value);
private ref class NativeMethods
{
public:
// Declares managed prototypes for unmanaged functions.
[DllImport("..\\LIB\\PinvokeLib.dll")]
static void TestCallBack(FPtr^ cb, int value);
[DllImport("..\\LIB\\PinvokeLib.dll")]
static void TestCallBack2(FPtr2^ cb2, String^ value);
};
public delegate bool FPtr(int value);
public delegate bool FPtr2(string value);
internal static class NativeMethods
{
// Declares managed prototypes for unmanaged functions.
[DllImport("..\\LIB\\PinvokeLib.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void TestCallBack(FPtr cb, int value);
[DllImport("..\\LIB\\PinvokeLib.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void TestCallBack2(FPtr2 cb2, string value);
}
Public Delegate Function FPtr(ByVal value As Integer) As Boolean
Public Delegate Function FPtr2(ByVal value As String) As Boolean
Friend Class NativeMethods
' Declares managed prototypes for unmanaged functions.
<DllImport("..\LIB\PinvokeLib.dll", CallingConvention:=CallingConvention.Cdecl)>
Friend Shared Sub TestCallBack(
ByVal cb As FPtr, ByVal value As Integer)
End Sub
<DllImport("..\LIB\PinvokeLib.dll", CallingConvention:=CallingConvention.Cdecl)>
Friend Shared Sub TestCallBack2(
ByVal cb2 As FPtr2, ByVal value As String)
End Sub
End Class
Függvények hívása
public ref class App
{
public:
static void Main()
{
FPtr^ cb = gcnew FPtr(&App::DoSomething);
NativeMethods::TestCallBack(cb, 99);
FPtr2^ cb2 = gcnew FPtr2(&App::DoSomething2);
NativeMethods::TestCallBack2(cb2, "abc");
}
static bool DoSomething(int value)
{
Console::WriteLine("\nCallback called with param: {0}", value);
// ...
return true;
}
static bool DoSomething2(String^ value)
{
Console::WriteLine("\nCallback called with param: {0}", value);
// ...
return true;
}
};
public class App
{
public static void Main()
{
FPtr cb = new FPtr(App.DoSomething);
NativeMethods.TestCallBack(cb, 99);
FPtr2 cb2 = new FPtr2(App.DoSomething2);
NativeMethods.TestCallBack2(cb2, "abc");
}
public static bool DoSomething(int value)
{
Console.WriteLine($"\nCallback called with param: {value}");
// ...
return true;
}
public static bool DoSomething2(string value)
{
Console.WriteLine($"\nCallback called with param: {value}");
// ...
return true;
}
}
Public Class App
Public Shared Sub Main()
Dim cb As FPtr = AddressOf App.DoSomething
Dim cb2 As FPtr2 = AddressOf App.DoSomething2
NativeMethods.TestCallBack(cb, 99)
NativeMethods.TestCallBack2(cb2, "abc")
End Sub
Public Shared Function DoSomething(ByVal value As Integer) As Boolean
Console.WriteLine(ControlChars.CrLf + $"Callback called with param: {value}")
' ...
Return True
End Function
Public Shared Function DoSomething2(ByVal value As String) As Boolean
Console.WriteLine(ControlChars.CrLf + $"Callback called with param: {value}")
' ...
Return True
End Function
End Class