【问题标题】:Embedding Mono in Delphi Win32在 Delphi Win32 中嵌入 Mono
【发布时间】:2009-05-28 05:14:42
【问题描述】:

有谁知道如何在 Delphi Win32 应用程序中嵌入 Mono 运行时的细节?官方文档对 Win32 环境帮助不大(www.mono-project.com/Embedding_Mono)。

更新:

我非常熟悉 Delphi 中静态链接的变幻莫测,并且对 DLL 非常满意。 Mono 本身有依赖关系,所以多一个 DLL 真的没什么大不了的。关于 FPU 控制字的评论是我关心的问题之一,因为我相信 CG 默认设置与 Microsoft 工具不同。以下是我认为需要的:

  • 从“C”到 Delphi 的标题翻译(可能不太难)
  • Mono DLL 的编译(Mono 随附的是否可用?)
  • 更好地理解 FPU 控制字 goctha's(希望没有)
  • 来自尝试过这个特技而留下战斗伤痕的人的一些反馈 ;)

更新(2011 年 6 月 12 日):

如果有人感兴趣,我刚刚在 Google Code 上找到了一个将 Mono 嵌入 Delphi 应用程序的项目:

monoemb4delphi

【问题讨论】:

    标签: .net delphi winapi mono embedding


    【解决方案1】:

    Mono 似乎可以使用 mingw 构建,尽管我发现大多数参考资料都是从 Linux 交叉编译的,例如http://www.mono-project.com/Cross-compiling_Mono_for_Windows

    我会说你的首要任务是搜索一个 libmono dll

    • 不使用 cygwin(相信我)
    • 已知可以在 mingw 之外工作(如果使用 C++,请避免可能的 mingw 特定 C++ 修改)
    • 最好带有可读的标题。

    如果您找到或将其构建为 DLL(以满足 mghie 的正确评论),请编写一个标题(如 Stijn 建议的那样)它可以工作。

    不过,这不是微不足道的,VM 并不是微不足道的野兽,并且通常会出现跨语言问题域中的问题:库初始化(顺序)、FPU 异常掩码和一般的异常处理。这也是为什么我说“知道在 mingw 之外工作”的部分原因,研究它在其他编译器中的接口方式可能会为如何正确解决这个问题提供指导。

    请注意,单声道教程有一个单声道库初始化程序,但这并不意味着单声道使用的所有库都已正确初始化。特别是 mingw 的 libc 可能需要初始化,因为它们通常是通过 ctor 初始化的。我的(非常初始的)mingw 胶水代码在这里:

    http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/ide/fpmingw.pas?view=markup

    另一方面,在 DLL 中,它可能通过 DLL 初始化例程进行初始化。

    我自己已经能够将 GDB 构建为 lib 并使用它(虽然静态地在 FPC 中,但我没有制作 DLL 的动力,因为这是一种选择)

    请注意,如果您真的必须自己做这件事,这不是一个简单的方法。

    【讨论】:

    • 我不知道它是否有帮助,但 Visual Studio 2008 也可以构建 Mono 运行时。解决方案文件位于 /mono/msvc 中。
    • 我认为对于DLL路由会更好,这是Delphi的唯一方法。 (理论上,使用 BCB 构建时静态也可以工作)
    【解决方案2】:

    article by Rudy Velthuis 展示了如何将 C 库链接到 Delphi 的示例。通过一些工作,应该可以使用这种技术从 Delphi 访问mono_jit_init

    【讨论】:

    • Mono 是 LGPL,因此 Windows 上的静态链接需要从 Novell 获得商业许可,如 mono-project.com/Scripting_With_Mono 中所述(搜索“许可”)。
    • 你确定你没看错吗?我知道如果您想要嵌入单声道并且想要拒绝访问应用程序的单声道以避免修补,您需要商业许可证。
    • 链接的文章关注将 C 库静态链接到 Delphi 代码。以这种方式链接 Mono 会破坏许可证,因为您不能再用更新的版本替换它。可以说,LGPL 正是为了保护用户“修补”的权利。如果要使用 OTOH mono.dll,那么使用 DLL 的标准方法将适用,而 Velthuis 文章中的信息对此并没有真正的帮助。
    • 我看过 Rudy 的文章,过去也用 LibTiff 做过类似的工作。没什么好玩的,所以我会接受 DLL 方法。
    • @mghie - 只要您还提供原始目标文件,您就可以静态链接 LGPL 代码,以便最终用户可以替换 LGPL 部分并重新链接。
    【解决方案3】:

    【讨论】:

    • 我有 Hydra,但它并没有真正解决我想要完成的任务。即能够嵌入 .Net 运行时并提供与 Delphi 的紧密原生集成。顺便说一句,Hydra 是一个不错的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多