2012/09/21

C#からC++の関数にDLLを用いてアクセス

C++にはC++のいいところが、C#にはC#のいいところがありますが、
C++とC#を相互に行ったり来たりできたないかなと思って調べてみるといろいろできるようです。

今回はC#を用いてC++の関数にアクセスすることに注目しました。(暇なときに逆パターンもやってみる予定です。)

C#でC++を利用する場合には主に次の2通りがあるそうです。

●C++でDLLを作成しC#でアクセスする方法

●C++/CLIを用いてアクセスする方法

今回はDLLを使ってやりたいと思います。(C++/CLIを使ったほうがいろいろできるそうですが、これもまた次の機会に)

わかりやすいサイトがあったので、ほとんどここの写しですが、違うところだけ説明したいと思います。

Mr.Exception C#でネイティブDLLを直接呼び出し(配列を渡す)
http://xptn.dtiblog.com/blog-entry-109.html



まず、今回はC#もC++もVS2010を使ったので、C++でDLLを作るようにするには次のサイトを参考にしました。

チュートリアル : ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) の作成と使用
http://msdn.microsoft.com/ja-jp/library/ms235636%28v=vs.80%29.aspx


また、下の配列を渡すサンプルでは、C#のほうをコンパイルすると次のようなエラーが出ます。

アンセーフ コードは /unsafe でコンパイルした場合のみ有効です。
このエラーはコンパイラにオプションを付け加えると行けるそうなので下のサイトを参考にオプションを付けました。

/unsafe (unsafe モードの有効化)
http://msdn.microsoft.com/ja-jp/library/vstudio/ct597kb0.aspx

すると、今度はコンパイルは通りますが、デバックをすると次のような忠告がでて、デバックできなくなります。
PInvokeStackImbalance が検出されました
そして、これは.NETのバージョンが新しくなったことででてくるらしいものなのですが、
これも下のサイトを参考にして1行書き換えることによって解決しました。

「PInvokeStackImbalance が検出されました」って何だ? - あの中の蛙
http://d.hatena.ne.jp/inazakira/20110107/1294367910

Tips/Other/MeCab - Sheltie書庫室 - C#のいろいろ
http://wiki.sh4e.net/?Tips%2FOther%2FMeCab

このように書き換えました。

//[DllImport("sample.dll")]

[DllImport("sample.dll", CallingConvention = CallingConvention.Cdecl)]

これで、うまくいきました。

配列までできたらたぶん十分でしょう。

つぎはC#をコンソールじゃなくてクリックするボタンとかをつかって連携させてできるかどうかやってみようかな。










0 件のコメント:

コメントを投稿