On-demand installation of MDX Runtime (1)

MDX Architecture
個人的な布教活動もあって,KMCC67 で頒布したゲームには MDX を利用したものが 2 つほど含まれています*1
http://www.kmc.gr.jp/event/c67.html
MDX 利用時に必要なランタイムのうち,DirectX .NET Framework については Windows Update に任せるにしても,MDX Runtime を「各自入手してくれ」は鬼門です.というわけで (割と当時は悲惨な忙しさだったのですが) ちょこっと On-demand なインストーラを作ってプレゼントしてみました.今回は CD-ROM での配布なので,DirectX の再配布ファイルを気兼ねなく同梱できたのが大きいです*2
MSI を利用した大がかりなインストーラはどうも嫌われているようなので,ゲーム起動時に毎回 MDX アセンブリの存在及びバージョンを確認し,無ければ MsiInstallProduct() で MDXREDIST.MSI から直接インストールという方式をとりました.Release Note でも言及されている方式なので,ご存知の方も多いかと思います.
http://www.microsoft.com/japan/msdn/directx/dxreadmej.asp#Managed%20DirectX
案外に苦労したところが,ManagedDX.cab から MDXREDIST.MSI を抽出するところでした.大抵の Windows マシンにインストールされている Cabinet ライブラリとして CABINET.DLL がありますが,これを利用した CabDotNet というマネージドラッパーを見つけたので試してみました.しかし,時々コールバック周りで例外が発生するという現象が発生し,原因を突き止められないまま残念ながら時間切れ.結局 Cabinet SDK のサンプルプログラムをカスタマイズして Win32 DLL を作成し,P/Invoke で呼び出しという形でスピード解決しました.時間がないときには .NET のこういった実用主義的な面はとても助かります.

*1:Ruby/SDL を利用したゲームも入っていますが,こちらは exerb + SDL.dll 同梱でかなり楽そうです.ええなぁ.

*2:DirectX Runtime の再配布では「ファイル全てを含めること」という制限が MDX Runtime のみを再配布したい場合の壁になっています.参考として,Tom Miller 氏の blog に寄せられたコメント.GDN/J でのスレッド