On-demand installation of MDX Runtime (1)
個人的な布教活動もあって,KMC が C67 で頒布したゲームには 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 のこういった実用主義的な面はとても助かります.