非托管出口和代表

时间:2014-06-26 15:03:12

标签: c# delphi dll delphi-7

我正在使用Robert Giesecke Unmanaged Exports创建一个.NET包装器DLL,以便在Delphi 7中使用.NET DLL。到目前为止一切正常,但现在我有一个需要有回调/委托的函数。

如何做到这一点?

我可以将函数指针指向我的.NET DLL并从那里调用它,当它是,它是如何完成的?

3 个答案:

答案 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#方面:

  1. 定义代理人的签名

    public delegate void LinkCallback(int AValue);
    
  2. 创建一个IntPtr Varialbe来存储指针

    public IntPtr Callback;           
    
  3. 在获取指针的DLL函数中将其赋值给变量

    Callback = new IntPtr(cb);
    
  4. 要调用回调,您必须整理它

    LinkCallback callback = (LinkCallback)Marshal.GetDelegateForFunctionPointer(ConList[Idx].Callback,typeof(LinkCallback));
    
    callback(10);