« 国勢調査 | メイン | HDD交換 »

2005年10月 1日

.NET Compact Framework と P/Invoke

カテゴリー: [プログラミング]

.NET Compact Framework で仕事してますが,いろいろやっかいな事が多くてまいっています.

P/Invoke(Platform Invoke)は,.NETから,DLLにあるアンマネージ関数(いわゆるネイティブな関数)を呼び出す仕組み(のよう)ですが,.NET Compact FrameworkのP/Invoke は制限が強く,Windows CEのAPIを呼び出すのに一苦労です.

基本的な型は自動的にマーシャリングされますが,構造体(特に文字配列を含む構造体)などは,その対象になりません.そういう構造体を引数に持つ関数を呼び出す場合,マーシャリングを手書きしてやらないといけません.

では,どうするのか.byte配列を作って,そこに構造体に必要な情報を頭から順番に詰め込むのです...
byte配列で無くても,他にも方法はあるようですが,自分でメモリを確保して,そこに詰め込むという点においては大して変わりません.それができるように,それを補助するためのクラスが用意されています.文字列を,エンコーディングに従って,バイト列にしたり,バイト列をコピーしたりするものです.

で,WindowsのAPIの呼び出しには,構造体が多用されています.もちろん文字配列を含むものも多いわけです.一つAPIを呼び出せるようにするために,膨大なコードを必要とします.
引数が簡単なAPIならいいんですけどね.

構造体のメモリ上の並びは,.NET Frameworkと違って必ず書いた順番になりますから,かえって楽ですし,メンバの型がマーシャリングの対象になる型だけなら,特に考えることはないようなんですが,理想条件ばかりじゃないですから.

まあ,プラットフォームをまたぐ呼び出しが面倒なのは理解できますが,ちょっと面倒というか,ごちゃごちゃしすぎている感じです.プラットフォームをまたぐ複雑さが,コードに直接出てきてしまう感じですね.その割には,制限のためにそもそも呼び出せないAPIもあるんですよね.

投稿者 shingo : 2005年10月 1日 22:27

トラックバック

このエントリーのトラックバックURL:
http://isolinear.info/cgi-bin/mt/mt-tb.cgi/159

コメント

コメントしてください

コメントスパム等の対策のために,大量のURLを含むコメント,古いエントリーに対するコメント,連続したコメントなどは,一旦保留されます.




保存しますか?