我正在使用Robert Giesecke Unmanaged Exports创建一个.NET包装器DLL,以便在Delphi 7中使用.NET DLL。到目前为止一切正常,但现在我有一个需要有回调/委托的函数。
如何做到这一点?
我可以将函数指针指向我的.NET DLL并从那里调用它,当它是,它是如何完成的?
答案 0 :(得分:5)
非常简单。您可以像使用标准p / invoke一样定义委托类型。
这是我能想到的最简单的例子:
<强> C#强>
using RGiesecke.DllExport;
namespace ClassLibrary1
{
public delegate int FooDelegate();
public class Class1
{
[DllExport()]
public static int Test(FooDelegate foo)
{
return foo();
}
}
}
<强>的Delphi 强>
program Project1;
{$APPTYPE CONSOLE}
type
TFooDelegate = function: Integer; stdcall;
function Test(foo: TFooDelegate): Integer; stdcall; external 'ClassLibrary1.dll';
function Func: Integer; stdcall;
begin
Result := 666;
end;
begin
Writeln(Test(Func));
end.
<强>输出强>
666
C#端的默认调用约定为CallingConvention.Stdcall
,所以我已经这样做了。这是显而易见的事情。
答案 1 :(得分:-1)
你可以:
1)使.NET DLL函数返回一个由Delphi 7 DLL消耗的Integer。然后,变化的返回结果将触发在Delphi 7 DLL中调用的各种过程。
2)使其完全原生(从NET转换为Delphi 7)。
3)使其完全NET(改为完全NET)。
4)如果它们都是DLL,你可以通过非托管DLL调用将本机DLL函数从Delphi导出到.NET。
答案 2 :(得分:-2)
找到答案,Call C function inside C# via function pointer给了我很多帮助
基本上你可以发送指针并调用它
在C#方面:
定义代理人的签名
public delegate void LinkCallback(int AValue);
创建一个IntPtr Varialbe来存储指针
public IntPtr Callback;
在获取指针的DLL函数中将其赋值给变量
Callback = new IntPtr(cb);
要调用回调,您必须整理它
LinkCallback callback = (LinkCallback)Marshal.GetDelegateForFunctionPointer(ConList[Idx].Callback,typeof(LinkCallback));
callback(10);