« URGライブラリをDLL化する | トップページ | 配列を含むC++の構造体をC#で使うには »

2010年7月30日 (金)

URGライブラリをC#で使えるようにする(2)

引き続き、URGライブラリをC#で使えるようにするための作業を進めています。先日の日記で、URGライブラリをDLL化できたところまで報告しました。

DLL化したURGライブラリの関数をC#から呼び出せるようにするためのコードを書き始めましたが、これがなかなか難しい。というのは、プラットフォーム呼び出しを行うには、マネージドコードとアンマネージドコード、マーシャリング等について十分理解しておく必要があるからです。

例えばURGライブラリを使用するときに一番最初に呼び出すべき、初期化関数を考えます。初期化関数の書式は、 void urg_initialize(urg_t* urg) です。この引数にあるurg_t は構造体なので、C#で扱うためにはC#のソースコード中でこれを再度定義してやる必要があります。この urg_t はメンバとしてさらに別の構造体をもっているので、その構造体も定義する。手間がかかりますね。それだけならいいのですが、引数がポインタ型なので、これをC#でどうやって扱ったらいいか困りました。

とりあえずこんな感じかなぁということで、下記のように書いてみました。

[DllImport("UrgLibDll.dll")]
public extern static void _urg_initialize(ref urg_t urg);

そして、テストプログラムでは次のように呼び出してみました。

UrgLib4CS.UrgLib4CS.urg_t   urg = new UrgLib4CS.UrgLib4CS.urg_t();            UrgLib4CS.UrgLib4CS._urg_initialize(ref urg);

ビルドは通ったのですが、実行してみると"SafeArrayTypeMismatchException" という例外が発生してしましました。予想としては、C++の構造体メンバで char だったものを、C#でもそのまま char にしたことによるのではないかと思います。C++のcharは、C#では byte型に置き換えなきゃいけないみたいですね。

続きはまた明日。

« URGライブラリをDLL化する | トップページ | 配列を含むC++の構造体をC#で使うには »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/49015818

この記事へのトラックバック一覧です: URGライブラリをC#で使えるようにする(2):

« URGライブラリをDLL化する | トップページ | 配列を含むC++の構造体をC#で使うには »

最近の写真