使用stdcall创建可以在Delphi应用程序中导入的C#DLL - 可能?

时间:2009-06-30 11:24:42

标签: c# delphi delphi-2007 stdcall

我有一个程序,我需要创建一个DLL,希望在C#中。该程序是用Delphi编写的,我有一个代码的接口文件。该接口使用stdcall调用约定。

是否可以创建符合接口的C#DLL并可以在Delphi应用程序中使用?

是否有一些示例代码演示了如何将C#DLL编码为stdcall接口方法?

9 个答案:

答案 0 :(得分:7)

这在纯C#中是不可能的,但是this is an article显示了如何将非托管导出表添加到C#库,然后可以在任何其他语言中使用。请注意,大量引用闪电战不应该让你失望 - 它们与作者自己的背景有关,与基本概念及其运作方式无关。

Brian Long's one conference paper中还有一节。尽管C#没有这样做,但Delphi.Net实际上支持非托管导出,这让你觉得有点讽刺。我不知道Delphi Prism是否也是如此。

答案 1 :(得分:6)

我以前一直沿着这条路走下去。我选择的解决方案是创建一个 NEW C#程序集(我后来将其移植到Prism),它通过com interop暴露了我需要达到的功能。我发现通过黑色拳击API调用更简单的东西,我能够减少我必须处理跨越互操作屏障的类的数量。

我确实看过Hydra,但是我试图做的事情太过分了......这是访问第三方SDK,它在.net程序集中呈现以处理数据。如果您正在考虑在您的应用程序中嵌入功能(gui对象,等等),那么您应该考虑Hydra。

我确实使用Managed.VCL作为系统的早期版本,但后来放弃了Prism / C#com互操作方法,这种方法更易于部署,而且更稳定。

答案 2 :(得分:3)

查看Hydra

答案 3 :(得分:3)

出于好奇,你为什么希望编写一个打算在C#中使用本机应用程序的.dll?

托管C ++,Delphi for .Net和现在Delphi Prism都使用非托管导出支持这一开箱即用。按照设计,C#和VB.net不会。不知道为什么。但正如Cobus所说,你可以解决这个问题。这样做需要您自担风险。

除了来自RemObjects的Hydra之外,AToZed正在介绍CrossTalk

答案 4 :(得分:2)

您需要使COM可以访问程序集(= C#DLL),这称为Interop。

请参阅MSDN文章Assembly to Type Library ConversionPackaging an Assembly for COM,其中介绍了执行所需操作的技术背景和实用程序。

答案 5 :(得分:2)

我在Delphi Prism新闻组中找到post from Robert Giesecke。在其中,他宣布了一个项目,您可以添加到一个解决方案中,只需向其添加DllExport属性,即可从.Net DLL中导出任意函数。它支持封送,就像DllImport一样。他用Prism项目演示了它,但我想它也适用于C#类。该帖子是在三月制作的,所以我不确定附件是否仍然可用。 5月发布的Prism消除了这种工具,因为它本身就支持非托管出口。

答案 6 :(得分:2)

我假设Delphi应用程序不是基于.NET的应用程序,因此您需要在Win32进程中托管.NET运行时。

CorBindToRuntimeEx是MSCorEE.dll中的一个函数,它保存.NET运行时。有了它,您可以托管运行时,然后在其中创建对象并与它们进行交互。

答案 7 :(得分:1)

我很确定这不能直接完成。您必须在C ++ / CLI中编写图层或将C#代码公开为ActiveX接口。但是第二个选项可能无法满足您的界面。

答案 8 :(得分:1)

这不是直接可行的。 C#是托管代码。这意味着它需要一个非常特定的运行时环境才能运行,这是Delphi无法直接提供给它的环境。它不像C,只需找到函数的地址和调用约定并调用它。

但是,可以在Delphi应用程序(或任何其他Windows应用程序)中托管公共语言运行时。我不知道该怎么做。我只知道这是可能的。 (这很可能是史蒂夫提到的'Hydra'会做的事情。)