【问题标题】:Consume .NET assembly in Delphi XE2在 Delphi XE2 中使用 .NET 程序集
【发布时间】:2011-12-21 03:29:13
【问题描述】:

我有一些在 .NET 中实现的业务逻辑和一些在 Delphi 中实现的业务逻辑。现在我打算升级到 Delphi XE2。

我们有什么规定可以使用 Delphi XE2 的 .net 程序集吗?

更新:我听说了 Hydra 框架,它使我们能够集成托管和非托管代码。任何人都可以通过一个小的演示/代码 sn-p 来解释更多吗?

更新:我在这个 Hydra Framework 的试用版上尝试了一些东西。但它还需要修改您的 .NET 程序集以创建接口,以便我们可以将其映射到 Delphi 代码。

有什么方法可以在不修改的情况下使用 .NET 程序集?

【问题讨论】:

    标签: .net delphi delphi-xe2 hydra


    【解决方案1】:

    Nilesh,我只能从 Delphi 6 的角度来回答这个问题,所以请记住,Delphi XE2 可能有更新的 .NET 互操作选项。

    因此,要从(您的)Delphi 6 应用程序使用(您的).NET 程序集功能,最简单的方法是将 .NET 程序集修改为 COM 可见,并在 Delphi 中以正常方式简单地使用所述 COM 接口。

    来自 .NET 项目;将您需要的功能提取到一个(或多个接口)中,将 GUI 属性应用于这些接口。在项目选项中将项目标记为“COM Visible”并重建。您需要向 COM 注册程序集(如果内存可用,请从命令行运行 regsvr!)

    来自德尔福;执行类型库的导入以从程序集 DLL 中获取 TLB,然后只需 CoCreate() 与适当的 GUID 并像任何其他 COM 库一样使用。

    【讨论】:

    • OP 知道如何使 .NET 互操作。这个问题专门针对 XE2 可能的兼容性中断。
    • OP 问题中的哪些内容说明了兼容性?它专门询问如何在 XE2 中使用 .NET 程序集,答案是 COM 互操作(除非您使用 AtoZed CrossTalk 之类的第三方框架,它可以在不使用 COM 的情况下直接加载和访问程序集)。
    • @RemyLebeau-TeamB "一些逻辑,我计划升级到Delphi XE2" - 在这种情况升级听起来像我有一个用Delphi .并且 AFAIK 除了 COM 互操作之外还有其他解决方案 - 请参阅 Fabricio 答案。所以恕我直言,XE2 的主要关注点(除了更新 2 修复的 kwown 错误)是关于 32 位工作解决方案的 64 位编译 - 请参阅我的答案。
    【解决方案2】:

    关于 XE2,唯一可能突破的新功能应该是 64 位。

    但从 COM 的角度来看,以 32 位或 64 位代码实现或调用 COM 对象可能很重要。

    COM 对象类型通过注册表项注册。这就是 regasm.exe 实用程序执行(写入注册表)。 32 位注册表 节点和明显不同于 64 位注册表节点。

    例如,如果您的 COM 对象编译为 32 位,则应在 32 位注册表或 64 位注册表中注册(通过reagasm 调用)

    但是如果你坚持使用 32 位的 Delphi 应用程序,你不会有任何额外的问题,如果你指定 COM 包装器导出为 32 位。简而言之,在创建 32 位进程时,XE2 的行为与任何先前版本的 Delphi 完全相同。

    有关更多信息,请参阅http://www.gfi.com/blog/32bit-object-64bit-environment

    另一种解决方案是在进程之外运行 COM 对象:在这种情况下,位数无关紧要,您应该不会有任何关于 32 位或 64 位的问题。

    请注意there was a very annoying bug in XE2:简而言之,COM 访问在某些情况下被破坏。听起来latest "Update pack 2" 解决了这个问题。

    当然,如果您使用 Delphi XE2 的跨平台特性,您的 COM 对象在 Mac OS X 中将不可用。;)

    【讨论】:

      【解决方案3】:

      看看AToZed CrossTalk,它可以直接使用 .NET 程序集,而不需要使用 COM 互操作。

      【讨论】:

      【解决方案4】:

      您可以执行所谓的非托管导出

      Delphi Prism 支持该语言,C#/VB.NET 不支持。但是有一个项目模板可以使用它,请参阅author site

      非托管导出是一种允许本机代码在没有 COM 互操作的情况下调用托管代码的技术。吉赛克先生have an article on the subject.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2021-05-07
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 2011-12-11
        相关资源
        最近更新 更多