11

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

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

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

4

9 回答 9

7

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

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

于 2009-06-30T12:37:53.043 回答
6

我以前也走过这条路。我选择的解决方案是创建一个的C# 程序集(我后来将它移植到 Prism),它通过 com interop 公开了我需要达到的功能。我发现通过将 API 调用黑盒化为更简单的东西,我能够减少必须跨互操作障碍处理的类的数量。

我确实看过 Hydra,但对于我试图做的事情来说,这有点矫枉过正......这是访问 .net 程序集中提供的第 3 方 SDK 来处理数据。如果您正在考虑在您的应用程序中嵌入功能(gui 对象等),那么您应该考虑一下 Hydra。

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

于 2009-06-30T16:08:26.113 回答
3

看看九头蛇

于 2009-06-30T11:26:58.240 回答
3

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

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

除了 RemObjects 的 Hydra 之外,AToZed 还引入了CrossTalk

于 2009-06-30T14:07:00.290 回答
3

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

于 2009-06-30T15:03:12.093 回答
2

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

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

于 2009-06-30T11:46:48.263 回答
2

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

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

于 2009-06-30T16:48:39.273 回答
1

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

但是,可以在 Delphi 应用程序(或任何其他 Windows 应用程序)内托管公共语言运行时。我不知道该怎么做。我只知道这是可能的。(史蒂夫提到的这个“九头蛇”很可能就是这样做的。)

于 2009-06-30T11:39:09.837 回答
1

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

于 2009-06-30T11:28:29.547 回答