【问题标题】:Create a C# DLL That Can Be Imported in a Delphi App Using stdcall - Possible?创建一个可以使用 stdcall 在 Delphi 应用程序中导入的 C# DLL - 可能吗?
【发布时间】:2010-11-06 23:34:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# delphi delphi-2007 stdcall


    【解决方案1】:

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

    Brian Long's one conference paper 中也有一个部分。有点讽刺的是,Delphi.Net 实际上直接支持非托管导出,尽管 C# 没有这样做。我不知道这是否也适用于 Delphi Prism。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        看看Hydra

        【讨论】:

          【解决方案4】:

          出于好奇,您为什么希望编写一个旨在用于 C# 原生应用程序的 .dll?

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                    【解决方案9】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-01-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多