6+ .NET libraries Compact Framework developer should know about.

思いつきネタ(・∀・)
元ネタはこちら。

Compact Frameworkで使うライブラリを紹介してみますという感じで(・ω・)
主にSDFの紹介というか、ライブラリと言うよりCompact Frameworkで機能をどう実現するかという話な気もしますが。

Smart Device Framework

http://www.opennetcf.com/Products/SmartDeviceFramework/tabid/65/Default.aspx

何はなくともまずはこれでしょう(・∀・)
Full Frameworkに慣れた人がCompact Frameworkを初めて触ったときの反応は、

  l::::::::::::::::::|_!::lヽ:::::::::ハ::::::::::::::::::::::::::::::::i、::! ノ 
  !:::::::::::::::::l-‐ェ!;ト ヽ:::::l ´!:::::::::::::::::::::::::::::l ` ヽ   幺ク 亡 月 |  ┼‐ .|] |] 
  l:::::::::::::::::「(;;;)ヽ、__、::レ'´l:::::::::/l、:::::::::::::l   /   小巴 三l三. ヽ_ノ / こ o o 
  !:::::::::/l:::l__,,,rタ"゙、;!)、__!::::/ノ 〉、::::::::l   \ 
   l::::/ lヽ!    _ _   l;/´  ! >、::l   /  .NET Compact Frameworkの貧弱さに絶望した!! 
  ノノlヽ、_!    r――‐┐   /_ノ:::|  / 
    l::::::>、   レ,二二ェ!  /i:::::::::::l   ̄ ̄|_     /ヽ、  /\   /\    / 
    l:::/ /::ヽ、 `ー-―-' ,ィ'::::!\:::::l    (ヽ、//\/   \/   \/   \/ 
    レ' ム-''´lヽ、  _,,./! ゙ヾ!__ヽ!    ヽ´ヽ、ヽ 
            !   ̄     レ;'´  |  (,ゝ、 \ ヽ l、 
        /| _,,.-/´  ;; .,,,-!  ヽ、 ヽ、 | | ! l 
       / 斤'"〇 /´    ,;;:''" _,l_   ヽ ヽ/  l | l 
      /; l、」_,,/     '' ゙;;/  ヽ、   〉  `ヽ  l/ 
      /!,r''´!/  /     ';,/"゙''':;,,,,;;'' \ /     ,! 
    / l ,;;  |l  /`'';, ,,   /   ,;;''"゙''   l     / 


そんな不満を解消してくれるのがSmart Device Framework(以下SDF)です(・∀・)


Native APIをラップしたり、Compact Framework(以下CF)ではサポートしていないメソッドオーバーロードを提供してくれたりと、CFの開発者には必須と言っても良いライブラリじゃないかと。
例えばどんな機能があるかについて、ちょっとだけ書いてみますが。

OpenNETCF.Windows.Forms.dll

CFでFormsアプリケーションを作ったときに困るパターンとして、以下のようなものがありますね(´・ω・`)

  • IMessageFilterがサポートされてねーよ(♯・∀・)
  • Application.Run()がRun(Form)しかサポートされてねーよ( ゜Д゜)ハァ?

ご安心ください、そのためのSDFです(`・ω・´)
SDFではApplicationクラスの代替としてApplication2クラスが用意されています。
Application2クラスでは、IMessageFilterのサポートも、Application.Run()のForm引数無しバージョンもサポートされています。
いったいどういう仕組みなのかと言えば、GetMessage()、TranslateMessage()、DispatchMessage()辺りを使った独自のメッセージポンプを用意するという、生Win32アプリみたいな事をやっているんですよね(゚Д゚)


その他のForms関連のネタとしては、OwnerDrawnListにあたりとか。
Windows CEだと、そもそもNativeレベルでリストボックスがオーナードローをサポートしていないので困ったもので(´・ω・`)
ちょっとしたグラフィカルなリストを作ろうにも、ListViewを使ってオーナードローをする(CFなら要Hook)か、フルスクラッチでControl派生のリストを作るかになるわけですが。
っで、Control派生のリストとしてSDFで提供しているのが、ListBox2やそのベースであるOwnerDrawnListになります。
まあ、要求によっては自分でスクラッチでControl派生のリストを作った方が良いケースもありますけどね(・∀・)y‐~~


ちなみに、CFでのメッセージのフックについてはこの辺も参照に。

そうそう、フックと言えばSDFではKeyboardHookクラスなんかも用意されていますが。
SDFに似たキーボードフッククラスの作り方についてはこの辺に書いているので、そちらも参照に。

OpenNETCF.dll

CFではサポートされていない機能の代替品が色々入っています。
メソッドオーバーロードが足りない人用に、Enum2、Environment2だとか(´д`)
CFにはBackgroundWorkerが無いんだよな〜という人には、OpenNETCF.ComponentModel.BackgroundWorkerだとか。
簡易的なログ出力とかしたいんだけどな〜という人には、OpenNETCF.Diagnotics下にCFには無い機能の代替クラスがありますよ(・ω・)


あと、CFで困るのがマーシャリング関連の貧弱さ(´・ω・`)
APIを叩くときにその貧弱さに泣きたくなることもありますが。
そんな貴方にはOpenNETCF.Runtime.InteropServices.AdvancedMarshalerをどうぞ。
これは何かと言えば、AdvancedMarshaler派生クラスのメンバ変数とbyte配列の変換をサポートしてくれるもので。
P/Invokeでstructを渡す代わりに、AdvancedMarshalerを通じてシリアライズしたbyte
配列を使う目的で使用します。


その他のものとしては、OpenNETCF.ToolHelp名前空間にはModuleEntry、ProcessEntry、ThreadEntryクラスとかがあって。
つまりtoolhelp.dllのラッパーなわけですが、これをそのまま使うだけでタスクマネージャが作れますね(・∀・)

OpenNETCF.Drawing.dll

CFでは描画処理の貧弱さもまた困りもの(´・ω・`)
特にCF 1.0時代はGraphics.GetHdc()すら未サポートだったりしてね(つд`)
そんな経緯もあって、OpenNETCF.DrawingではGDIラッパとして独自にGraphicsEx、PenEx、FontEx、BitmapExなんかを用意しています。

OpenNETCF.Net.dll

OpenNETCF.Net.NetworkInformation名前空間は微妙に気合いが入っていますけど。
要はiphlpapi.dllのラッパークラス群で。
Pingクラスみたいに単純なものをはじめ、ネットワークインタフェース・アダプタ周りのクラス群がFull Frameworkに似せた形で用意されていますね。
この辺のクラスの使い方については、SDFのサンプル中のNetUI、GetNearbyAPListを参考にすれば良くて。
簡単にNetStumbler的なものが作れることがわかると思います(・∀・)


あと、OpenNETCF.Net.FtpFTP関連のクラスもあるようですが。
ただこれ、Full Frameworkに併せてFtpWebRequest/FtpWebResponse型の実装なので、むしろこっちの方が使い安いんじゃないかなと思ったり(・ω・)
http://community.opennetcf.com/forums/t/10502.aspx

OpenNETCF.Net.Mail.dll

メール送信用のSmtpClientクラスということで。
HTTPについては標準のHttpWebRequestがあるし、後はFTPSMTPもライブラリとしてあれば、スマートフォンアプリとしては十分ってとこですかね(・∀・)?

OpenNETCF.WindowsCE.dll

OpenNETCF.WindowsCE名前空間にあるのは、システム情報、メモリ情報、パワーマネジメントとかその辺のAPIラッパーのクラス群です。
あと、OpenNETCF.WindowsCE.Notificationには通知処理(CeRunAppAtTime()等)やLED制御なんかのラッパーも用意されているので、自前で定義を書く必要は無くなります。

OpenNETCF.WindowsCE.Messaging.dll

メッセージキュー関連のラッパーはこの辺にあります。
CEの場合、OSで用意しているメッセージキューに接続してシステム周りのイベントを拾うとかよくやるので(・ω・)



…っとSDFについて紹介してきたわけですが、実は自分はSDFを使っていなかったりしてね(´д`;)
なぜかというと、必要とするものについては同等の私家版を作ってしまっているから(・∀・)
ネットワーク関連については、FtpClientやSmtpClient、PopClientみたいなものまで。


SDFって、SDFとなる以前のCF 1.0時代に初期のネタがMSDNの記事に載っていたり、1.xの頃にソースを参考にしていたりしたので(・ω・)
CF 1.0時代からアプリを作ってきた人としては、必然的にカスタム版のライブラリが出来てしまったという次第。


ちなみに、SDFのソースが見たい人は$50でStandard Editionを購入すればソースもついてくるのでどうぞ(・∀・)

Expressions

https://source.db4o.com/db4o/trunk/db4o.net/Libs/compact-3.5/System.Linq.Expressions/

CFではSystem.Linq.Expressionsをサポートしてないよとお嘆きのあなたにはコレ(`・ω・´)
これがあれば、CFでもExpressionsが使えますよ、フフフ...。


過去の日記ではこちらも参照。
タイプセーフにアドホックな条件が指定ができるライブラリを作る場合、やっぱりExpressionsが無いとね〜(´д`;) (Compact FrameworkでExpressionsを使う)

QRCode Library

http://www.codeproject.com/KB/cs/qrcode.aspx

モバイルと言えばQRコード
これを使えばEncodeもDecodeも出来ますよ(・∀・)
ちなみにVS2008でビルドして怒られるときの対応はこうね(・ω・)

MemoryStream memoryStream = new MemoryStream((byte[])Resources.ResourceManager.GetObject(fileName));


ところで、業務用ハンディなんかで2次元対応のレーザースキャナを積んでいるモデルがありますが。
ああいうのは、デコードライブラリもビルトインされているので、APIを呼び出せば文字列としてデコード結果を取れるので楽ちんポン。

GPS

GPSも、昔は自分でシリアルポート読んでいたわけですが。
今ならGPS Intermediate Driverがあるので楽ちんポン(・∀・)


CFからの利用については、SDKのサンプルにあるMicrosoft.WindowsMobile.Samples.Locationをそのまま使うのでも良いんじゃないかと思ったり。
サンプルの場所は以下。

Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS

GPS Intermediate DriverのAPIってそもそも4つしか無いし。
GPSのオープン、クローズ、位置情報の取得、デバイス情報の取得と単純なもので。
上記サンプルは、バックグラウンドスレッドでWaitForMultipleObjects()しながら、位置情報/デバイス情報に変化があったら非同期でイベントをあげてくれるというものです。



っで、その他、60+で紹介されているもので、CF対応しているものについても少し。

DotNetZip

http://dotnetzip.codeplex.com/

ZIPの操作はこれで。

FileHelpers

http://filehelpers.sourceforge.net/

業務用のハンディだと、データベースではなく、上位からダウンロードした固定長ファイルをそのまま扱ったりすることもあって、こういうものは便利に見えますが。
ただ、CFが載るようなデバイスだと、リフレクションを使った処理のコストも馬鹿にならなくて(´д`;)
PCでやっている分には気にならないような処理も、CFではどうするか検討した方が良いことも。
自分としては、定型処理の簡略化が目的であれば、T4 Template使ってコード生成した方が良いと思うのよね〜(・∀・)y‐~~

System.Data.SQLite

http://sqlite.phxsoftware.com/

データ関連でついでに、SQLiteもCFに対応しています。



…っということで、Tech・DaysでWP7の開発ネタも聞けるのかな?、っというこの時に、今更CFネタなんかを書いてみたわけですが(´Д`)


ちなみに、自分はWP7での互換性の切り捨て歓迎派だったりして(・∀・;)
前に、スマートフォン開発者には「Win32を見せるな」「センサーやHW操作は抽象化したAPIを用意しろ」「UIはWPFにしろ」とか言っていたりもして。
アプリ開発者の裾野を広げて、つまらんことに煩わされずアイディア勝負にアプリを作って貰うには、そのくらいの割り切りは必要だろうという意見で(・ω・)
まあ、それはあくまで「スマートフォン」としての話であって、Windows CEを載っけた業務用ハンディーターミナルなんかまで余計な制約が出てきたりすると、それは困るんですけどね(´д`;)


ところで今週は高橋さんの本も発売しますね(・∀・)

Windows Mobile 6.5 アプリケーションプログラミング

Windows Mobile 6.5 アプリケーションプログラミング