自分の得意言語は、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] は、ソースにあわせて変更して下さい。

 

Joomla templates by a4joomla