1

一般:Windows、OS X、およびLinuxでネイティブの静的にリンク可能なライブラリとしてサポートしたいBoostライブラリを使用する標準準拠のC ++ APIがあり、WindowsおよびMonoで.NET用にラップしたいOSXおよびLinuxで。

詳細:現在、すべてのプラットフォーム用にネイティブにコンパイルしています。これは、標準のC++とBoostを使用した後のことです。また、WindowsでC ++ / CLI用にコンパイルして実行することもできましたが、Boost.DLLを使用せざるを得ませんでした。次のステップ*nixシステムで共有ライブラリを使用しようとしたことがないため、どこから始めればよいかわかりません。BoostがLinuxで共有ライブラリを提供していることは知っていますが(OS Xでも同じことが当てはまると思います)、これらはVisualStudioでコンパイルされたC++ / CLI実行可能ファイルで自動的に機能しますか、それとも何らかの作業が必要ですか?MonoDevelop用のC++/ CLIコンパイラはありませんが、おそらくVisualStudiosでコンパイルされたCLIは問題なく動作します...動的にリンクされたライブラリが私を混乱させています。

4

4 に答える 4

7

でコンパイルされている場合、C++/CLI アセンブリは Mono でのみ読み込まれます/clr:pure。混合モードの C++/CLI アセンブリ (ネイティブ コードを使用するアセンブリ、つまりブースト) は、Windows 以外のプラットフォームでは実行されません。

最善の選択肢は、C API を提供し、P/Invoke を使用してネイティブ コードを呼び出すことです。両方のプラットフォームに同じ C API を含めれば、これはプラットフォーム間で移植可能です。

于 2010-11-02T18:37:09.283 に答える
2

もう別の解決策を見つけたと思いますが、この質問がまだ検索に表示されていると確信しています。

Mono は最近、 CXIでの C++ 相互運用性に関してかなり大きな進歩を遂げました。

この投稿から、短い話として、新しい CXI テクノロジにより、C#/.NET 開発者は次のことができるようになります。

  • C# またはその他の .NET 言語から既存の C++ クラスを簡単に使用
  • C# から C++ オブジェクトをインスタンス化する
  • C# コードから C++ クラスの C++ メソッドを呼び出す
  • C# コードから C++ インライン メソッドを呼び出す (ライブラリが -fkeep-inline-functions でコンパイルされているか、サロゲート ライブラリを提供している場合)
  • C# から C++ クラスをサブクラス化する
  • C# メソッドで C++ メソッドをオーバーライドする
  • C++ クラスまたは混合 C++/C# クラスのインスタンスを、ネイティブ コードであるかのように、C# コードと C++ の両方に公開します。

CXI は、Mono と C++ 言語との相互運用性を改善するために、Google の Summer of Code からの 2 つの夏の作業の結果です。

于 2012-02-17T07:18:32.700 に答える
1

C++/CLI は C++ ではないため、C++/CLI でこれを実際に行うことはできません。リードが言うように、を使用してコンパイルする必要があります/clr:pure。これにより、すべてのクラスを削除して CLR クラスに置き換える必要があり、そもそもそこでコンパイルしようとする点が本質的に無効になります。

なぜこれをやろうとしているのですか?

于 2010-11-02T18:58:54.407 に答える
0

.netは、ライブラリ (.net では基本的にすべて動的にリンクされている) を検索するためのモデルとして" Fusion "に準拠していることに注意してください。Windows プラットフォームでは、ネイティブ コードはフュージョン ロード モデルに従いません。LoadLibraryEx documentationを確認し、次のように記載されている場所から読んでください。

LoadLibraryEx 関数は、ファイル名がパスなしで指定され、ベース ファイル名がロードされたモジュールのベース ファイル名と一致しない場合、またはパスが指定されているが LOAD_WITH_ALTERED_SEARCH_PATH が使用されていない場合、モジュールの標準検索を実行します。

...そして次の段落。C# を C++/CLI にビルドした方法は、現在 x86 または x64 として JIT されているかどうかを C# ローダーにチェックさせ、そのアーキテクチャに一致する C++/CLI アセンブリを明示的にロードすることです。そうしないと、C#側で「AnyCPU」としてコンパイルできません。

これがWindows以外でどのように機能するかはわかりません...

于 2010-11-02T18:45:14.047 に答える