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

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

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

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

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

Brian Long的一篇会议论文中还有一节。 尽管C#没有这样做,但Delphi.Net实际上支持非托管导出,这有点讽刺。 我不知道Delphi Prism是否也是如此。

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

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

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

看看九头蛇

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

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

除了RemObjects的Hydra之外,AToZed还推出了CrossTalk 。

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

请参阅MSDN文章assembly到类型库转换和打包COMassembly,其中描述了执行所需操作的技术背景和实用程序。

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

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

  • 在Delphi程序中托管.NET运行时
  • .Net interop – 使用Delphi Win32的C#程序集
  • CorBindToRuntimeEx

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

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

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

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