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

11

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

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

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

9个回答

7
这在纯C#中是不可能的,但这篇文章展示了如何为你的C#库添加一个未经管理的导出表格(unmanaged export table),从而可以使它在其他任何语言中使用。请注意,对于Blitz的大量引用不应该让你感到困惑——它们只涉及作者自己的上下文,与基本概念和其工作原理无关。
此外,在Brian Long的一篇会议论文中也有相关章节。具有某种讽刺意味的是,尽管C#不支持未经管理的导出,但Delphi.Net实际上直接支持此功能。我不知道这是否也适用于Delphi Prism。

6
我以前曾经走过这条路。我选择的解决方案是创建一个新的C#程序集(后来我将其移植到Prism),通过com互操作公开所需达到的功能。我发现,通过将API调用黑盒化为更简单的形式,我能够减少跨互操作界限处理的类的数量。
我确实研究了Hydra,但它对我尝试做的事情来说过于复杂了...那就是访问一个以.net程序集呈现的第三方SDK来处理数据。如果你正在考虑在你的应用程序中嵌入功能(GUI对象等),那么你应该考虑使用Hydra。
我确实使用过Managed.VCL的一个非常早期版本,但后来放弃了它,转而采用Prism/C# com互操作方法,因为它更容易部署,更稳定。

3

3

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

Managed C++、Delphi for .Net和现在的Delphi Prism都支持使用未管理的导出来完成这一点。设计上,C#和VB.net不支持。不确定为什么。但正如Cobus所提到的,您可以通过某种方式绕过此问题。但这样做存在风险。

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


3

我在 Delphi Prism 论坛上发现了一篇来自 Robert Giesecke 的帖子。他在其中宣布了一个项目,可以将任意函数从 .Net DLL 中导出,只需将 DllExport 属性添加到它们中即可。它支持像 DllImport 一样的编组。他用 Prism 项目演示了它,但我想它也适用于 C# 类。这篇文章是在三月份发布的,所以我不确定附件是否仍然可用。Prism 的五月版已经支持自身的非托管导出,因此不再需要这样的工具。


2

2

1
我非常确定这个无法直接完成。你必须要么编写一个C++/CLI层,要么将C#代码公开为ActiveX接口。但第二个选项可能无法满足你的接口需求。

1

这是不可能直接实现的。C#是托管代码。这意味着它需要一个非常特定的运行时环境才能正常工作,而Delphi无法直接为其提供此环境。这与C不同,您不能仅仅找到函数的地址和调用约定然后调用它。

但是,在Delphi应用程序(或任何其他Windows应用程序)中托管公共语言运行时是可能的。我不知道如何做到这一点。我只知道这是可能的。(很可能这就是Steve提到的“Hydra”所要做的事情。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接