在c#dll中调用delphi5过程

时间:2011-03-10 14:26:51

标签: c# delphi dll function-pointers

我有一个大问题。我有一个调用c#dll的delphi5应用程序。我想从我的c#dll调用一个函数,它需要一个指向delphi过程的指针作为输入参数。在这个c#函数中,之后调用delphi过程。

我尝试使用IntPtr:

在c#侧声明函数指针
ourFunction(IntPtr fct){
   ...
   helpFct = (OurType)Marshal.GetDelegateForFunctionPointer(fct, typeof(OurType));
   ...
}

如果我从c#调用该函数,一切正常。但是,如果我想从Delphi(使用delphi过程作为输入参数)调用它,它会崩溃而不会向我提供有关错误的任何信息。

这是我的delphi代码:

hBuffer : THandle;
buffer : PInteger;
...
hBuffer:=GlobalAlloc(GMEM_fixed,SizeOf(Integer));
buffer:=GlobalLock(hBuffer);
buffer := Addr(AddDelphi);
intfRef.ourFunction(buffer^);

是否有人遇到过这些问题,或者有些想法可以解决这些问题?

感谢 斯蒂芬

2 个答案:

答案 0 :(得分:2)

如果是Delphi 5,那就是.NET之前的版本。您最好的选择是regasm C#程序集,并从Delphi 5应用程序中将其作为COM对象访问,以便工作。

当然,您可能还需要检查并确保调用与COM兼容。

答案 1 :(得分:0)

我不确定它在Delphi 5中是否有效,但在过去我使用RemObjects Hydra成功地将用C#编写的.NET内容集成到Delphi中(Hydra也可以做其他方式:集成Delphi的东西在.NET)。

函数指针很难,因为.NET运行时和Delphi运行时有点不同。

您可能想要尝试的是将您的Delphi函数导出到DLL中,并使用来自C#/ .NET端的P / Invoke来导入它们。然后,.NET将从Delphi DLL编组为.NET的处理方式,然后返回。

最后,您可以尝试使用JCL TJclClrHost在Delphi中托管.NET运行时(请参阅this SO question了解更多信息)。

- 的Jeroen