mono の freepascal ライブラリ (.dylib) の使用
-
25-09-2019 - |
質問
Monotouch で使用するために C# と Delphi Prism を学ぶのはやりがいがありますが、通常の Object Pascal で書かれたコードを再利用する方法を探しています。私が 15 年間にわたって Delphi で行ってきたすべてを単純に書き直すことは、まったく受け入れられません。
したがって、私の質問は 2 つあります。
- 議論のために、外部依存関係のない通常のオブジェクトパスカルにライブラリを書いている場合、iPhone用のアームフリーパスカルコンパイラでコンパイルされている場合 - 結果のディリブをMonotouchのDylibを使用できますか?
- 上記が正しい場合、C#/Prism からこれらの外部関数を宣言して呼び出すにはどうすればよいですか?レコードタイプの受け渡しなどをどのように処理すればよいですか。モノラルで?
他の iPhone アプリケーションには独自の dylib ファイルが同梱されていることに気付きました (SDL ゲーム ライブラリが典型的な例です)。これが機能しない理由は見つかりません。
解決
Monotouch を使用したことはありませんが、Mono/.NET には P/Invoke (プラットフォーム呼び出し) と呼ばれる機能があります。
基本的に、関数/プロシージャをマネージ コード内で extern として宣言し、 DLLImport
属性。
その名前とは対照的に DLLImport
から関数/プロシージャをインポートします .so
Linux 上のファイルと .dylib
ファイルも同様です。
他のヒント
私はモノタッチについては何も知りませんし、Arm デバイスに関連する Mac についてもあまり知りませんが、次のとおりです。
ライブラリが主に cdecl 呼び出し規約を使用しており、monotouch がネイティブの操作メカニズム (P/Invoke や JNI のようなもの) を介して cdecl (C) 関数を呼び出すことができる場合、それが機能する基本原則になります。
構造体についても同様で、{$packrecords C} で宣言します。
また、関数を呼び出す前に、2 つの関数 (IIRC FPC_INITIIALIZE とファイナライズするもう 1 つの関数) を呼び出して、FPC RTL を初期化/ファイナライズする必要がある場合もあります。
Delphiオブジェクトなど、おそらく使用できないような、プレーンCレベルを超えるものはすべて包まれなければなりません。多分 客観的 Pascal オブジェクトは再利用可能です (少なくとも Monotouch が客観的な C オブジェクトを理解している場合) が、他のほとんどの Apple 固有のものと同様、それは私の得意分野ではありません。