BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース CXXI が Mono に新世代の C++ 相互利用を実現する

CXXI が Mono に新世代の C++ 相互利用を実現する

ブックマーク

原文(投稿日:2011/12/20)へのリンク

CXXI は,C# と C++ の相互利用を Mono 上で容易に実現する,新しい C++ 相互利用フレームワークである 。C++ オブジェクトのインスタンス生成やメソッド呼び出し,C++ クラスのサブクラス化などが C# から簡単に実行できる。

マネージドコードからネイティブライブラリをコールするには,通常は P/InvokeCom 互換機能,あるいは インタセプタ のいずれかを用いなければない。どの方法を選択しても,大量のボイラープレートコードが必要となる上に,サブクラス化など実現不可能なものもある。CXXI を使用すれば,これらのことが非常に簡単に行えるのだ。

どのような仕組みなのだろう? CXXI のツールチェインは CXXI バインディングを生成し,ひとつの .NET ライブラリを作り出す。そのライブラリには,ネイティブライブラリ内にある C++ クラスのラッパとして振舞う C# クラスが含まれている。これがどのように実現されているかについては,Miguel de Icaza 氏が詳細に 説明している

同種の技術と比較した場合はどうだろう? .NET にはすでに,マネージド C++ コード を C# と相互運用可能にする C++/CLI がある。しかしこれは,既存のネイティブ C++ ライブラリを直接 C# で利用する,という意味では CXXI と同じではない。前述した3つの方法のいずれかがやはり必要なのだ (しかも mono ではサポートされていない)。もうひとつ,C# を含むさまざまな高レベルのプログラム言語に対して,C++ クラスを利用可能にするためのラッパ/インターフェースを生成する SWIG がある。しかし CXXI はこれとも違う,と Miguel は言う。

CXXI は C++ API のバインドを生成したり利用するだけではありません。既存の C++ クラスのサブクラスを新たに生成して,それらのインスタンスを C++ に戻して代わりに利用するのです。この操作は,ユーザがメソッドをオーバーライドするときに使用する vtables をパッチすることで実現しています。

新しいライブラリであるため,特にツーリング周辺が完全には安定していない。サポートされているシナリオの内容については,github プロジェクトテストで見ることができる。

この記事に星をつける

おすすめ度
スタイル

BT