自分の得意言語は、C#です
C#登場前は、C++とかで、書いてました。
なんで、自分のライブラリなんかは、C++であったり、オープンソースなんかは、cをラップしてCPPにして使ってました。
ですから、C#から簡単にCPPを使える技術は、とっても重宝するだろうと思っていました。
一応、C#からC++を呼び出すことは、可能なのですが、直接、記述出来ないので、何かと不便です。
そこで、調べていると、CXXIなるものがあることがわかりました。
こいつは、C++のヘッダ情報から、C#のラッパソースを吐き出すものだそうな
めちゃくちゃ便利そうだぞということで、実験しました。
最近、デスクトップは、Ubuntuなので、mono developを使い実験します。
とりあえず、CXXIの実行体を作るとこから始めます。
ソースを展開すると、autogen.shがあったので、実行します。
色々とエラーが出て、面倒なことになりそうです。
中身を見ると、cxxi.slnなるものがありました。
適当にmono developで開くと、普通に読み込めたので、ビルドを行いました。
やっぱり、エラーが出るので、プロパティからMakefile統合のチェックを外してビルドすると問題無く出来上がります。
すると、bin/releaseに、CPPInterop.dllとgenerator.exeが出来上がっています。
これを使ってCPPのラッパソースを作りマネージライブラリを吐き出すんですが、なぜか最終のマネージライブラリ生成中に失敗します。
ソースを見ると、コンストラクタの先頭文字が大文字になっています。
いやいや、小文字のライブラリだって作るでしょ ということで原因を調査したところ
以下の部分に問題がありました。
generatorプロジェクトのMethod.csのFormattedNameにて、わざわざ、先頭文字を大文字にするような記述があります。
なぜかは、わかりませんが、そういう仕様なんでしょう。
で、この箇所を
public string FormattedName {
get {
return Name;
}
こういうふうに書き直すと、普通に出力するようになりました。
CPPのソースからラッパーを作成する工程は、このページを参考にさせてもらいました。
mono developだと、ビルド後のカスタムコマンドで、以下を追加すればOKです
gccxml --gccxml-compiler "g++" --gccxml-cxxflags "-shared -fPIC" -fxml=${ProjectDir}/main.xml ${ProjectDir}/main.h
mono generator.exe -o=generated --lib=${ProjectName} ${ProjectDir}/main.xml
gmcs -out:${ProjectName}wrap.dll -target:library -unsafe -r:CPPInterop.dll ${ProjectDir}/generated/*.cs
[main.h] [main.xml] は、ソースにあわせて変更して下さい。