【问题标题】:Using a freepascal library (.dylib) from mono使用来自 mono 的 freepascal 库 (.dylib)
【发布时间】:2011-06-03 18:45:49
【问题描述】:

虽然学习 C# 和 Delphi Prism 与 monotouch 一起使用是有益的,但我正在寻找一种方法来重用用普通 Object Pascal 编写的代码。简单地重写我 15 年来在 Delphi 中所做的一切是完全不能接受的。

所以我的问题是双重的:

  1. 如果我为了争论有一个 用普通对象编写的库 没有外部依赖的 Pascal 并使用 ARM freepascal 编译 iPhone 编译器 - 我可以使用 monotouch 生成的 dylib?
  2. 如果以上正确,如何从 C#/Prism 声明和调用这些外部函数?如何在单声道中处理传递记录类型等?

我注意到其他 iPhone 应用程序附带了自己的 dylib 文件(SDL 游戏库就是一个典型示例)。我找不到为什么这不起作用。

【问题讨论】:

  • 注意有个dylib标签,可能会吸引更多的读者
  • 你为什么不试试网络搜索?我建议使用以下搜索词:mono freepascal dylib
  • @david:如果你是裁判。到 "wiki.lazarus.freepascal.org/…" 那么首先它不包括 ARM 编译器,其次它不考虑弱链接。这就是为什么。
  • @Jon 好的,那么您的问题到底是什么?当您尝试此操作时,它是如何失败的?
  • 我想知道是否可以做到。这在概念上没有问题,但在现实生活中会有实际问题。例如,将非托管结构作为指针参数传递。然后是 freepascal 编译器,它可能有不同的 req。在 ARM 上比在 x86 上(这就是我在这里要求反馈的原因)。总的来说,我认为它是完全有效的,除了弱链接 - fpc wiki 是直截了当的。但我听说在为 iOS 编译时必须特别小心。因此,我认为这个地方将是一个很好的地方。

标签: c# delphi xamarin.ios freepascal dylib


【解决方案1】:

我没有使用过 monotouch,但 Mono/.NET 有一个称为 P/Invoke(平台调用)的功能。

基本上,您在托管代码中将函数/过程声明为 extern 并添加 DLLImport 属性。

与其名称不同,DLLImport 从 Linux 上的 .so 文件和 .dylib 文件中导入函数/过程。

http://www.mono-project.com/Interop_with_Native_Libraries

P/Invoke in Mono

【讨论】:

    【解决方案2】:

    我对单点触控一无所知,对与 Arm 设备相关的 Mac 也知之甚少,但是:

    如果您的 lib 主要使用 cdecl 调用约定,并且 monotouch 可能会通过某些本机操作机制(P/Invoke 或 JNI 之类的东西)调用 cdecl (C) 函数,那么这将是一个可行的基本原则。

    结构也一样,用 {$packrecords C} 声明。

    在调用函数之前,您可能还需要调用两个函数(IIRC FPC_INITIIALIZE,另一个要完成)来初始化/完成 FPC RTL。

    任何高于普通 C 级别的东西,例如 Delphi Objects 等可能无法使用,必须包装。也许objective Pascal 对象是可重用的(至少如果 monotouch 理解 Objective C 的对象),但与大多数其他 Apple 特定的东西一样,这不是我的强项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多