【问题标题】:Implementing .NET Interface in Delphi在 Delphi 中实现 .NET 接口
【发布时间】:2012-10-09 18:18:25
【问题描述】:

我的主要应用程序是 C#,并引用另一个声明 IPluginIPluginHost 的 .NET DLL。我现在需要将此 DLL 导入到 Delphi 项目中,以便为主应用程序制作插件。我听说这是可能的,但是关于导入类(我不想要)或在 .NET 中运行 Delphi 代码的事情太多了

有没有人做过这件事,谁能澄清一下?

【问题讨论】:

    标签: .net delphi interop


    【解决方案1】:

    直接在 Delphi 中实现 .NET 接口将非常困难(我什至不确定是否可能)。但是,根据您想要把手弄脏的程度,您可以使用一些选项。

    1) 您可以在 Delphi 中创建一个 ActiveX DLL,然后将该库导入 .NET。然后,您可以在 C# 中创建一个实现该接口的代理类,并将调用路由到 Delphi ActiveX DLL。

    2) 您可以在 Delphi 中创建本机 Windows DLL,然后在 .NET 中编写接口。然后,您可以在 C# 中创建一个实现该接口的代理类,并将调用路由到 Delphi DLL。

    3) 您可以使用支持 .NET 和 Delphi 的插件框架,例如 Hydra (http://www.remobjects.com/hydra/)。

    在所有这些情况下,您应该小心处理 32/64 位情况,因为 .NET 代码能够在这两种情况下运行,但 Delphi 代码需要为每个环境独立编译。

    根据您的情况,另一种选择可能是以对象 pascal 的形式编写 Delphi 代码,该代码将生成称为 Oxygene (http://www.remobjects.com/oxygene/) 的 .NET 字节代码。

    编辑:如果您尝试创建用于 .NET 插件框架的 Delphi 插件,最好这样做:

    在 Delphi 中创建一个与您的 IPlugIn 和 IPlugInHost 接口匹配的新接口。然后,您可以构建一个 .NET Delphi 插件包装器,其中包含一些配置信息来指定要加载的 Delphi 插件。然后,这个 .NET 包装器将加载 Delphi DLL 并根据需要调用 DLL 方法。视觉的东西需要某种 ActiveX 包装器,但你应该能够很好地使用非视觉的东西。

    【讨论】:

    • 如果接口声明在其他地方怎么办?它已经在一个单独的文件中,我可以在那里使用更合适/互兼容的框架吗?
    • 您可以在 Delphi 中声明一个接口并在 Delphi 端使用它,但我不确定它是否会有很大帮助。您是要托管一个 Delphi“插件”还是多个?
    • 关于 COM / Active X:潜在的问题是您必须将 COM 对象注册为管理员,因此您的应用程序不能独立(除非您手动创建相应的 .reg 文件并导入它)不在 HKEY_LOCAL_MACHINE 中,而是在 HKEY_CURRENT_USER 中)。
    • 另一个要添加的链接,例如在处理低级 .Net CLR 结构方面比 Hydra 更好的是 managed-vcl.com 使用这个库,您可以毫无困难地完成 OP 需要的工作。
    • 不幸的是 managed-vcl 不能(Atozed 解决方案也不能):从他们的站点“托管 VCL 不能:如果 COM 不可见,则查询 .Net 接口。”。我也看不出如何在 Delphi 代码中实现 .NET 接口,这似乎是他问题的症结所在。从问题的外观来看,他试图允许为 .NET 插件框架创建 Delphi 插件。在 Active X 方面,这是一个限制,最好的选择是使用第二个选项。
    【解决方案2】:

    最简单的方法是为delphi 提供一个.NET to COM wrapper dll。我发现这是迄今为止与 .NET 交互最轻松的方式。

    【讨论】:

    • 您能否解释一下这将如何帮助生成实现 .net 接口的 Delphi 代码。
    • 我的观点是,您没有在 delphi 中实现接口,而是创建了一个与 COM 兼容的 .NET 网关/包装器,它实现了 .NET 接口,并通过 COM 公开所需的功能。
    • 这个细节应该在答案中。不明显。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多