たぷつきません

おなかがでてきた。もうたぷついてるやん。

Excel アドイン実行環境まとめ

 Excel2000にはPIA(Primary Interop Assembly:プライマリ相互運用機能アセンブリ)がないので、IA(相互運用機能アセンブリ)をVisualStudioがExcel COM Objectのタイプライブラリを照会して自動生成してアプリケーション(orライブラリ)と同梱させるという形をとる。これに限らずCOMを使う場合はみな同じ。Excel2000のIAは、ExcelXp,2003,2007でも動作する。COMライブラリ自体はインストール済みのExcelによってバージョンが異なるが、インターフェース互換なためアクセスできるということだ。ネームスペースが異なりいきなり「Excel」なのは自動生成なため。Office Xp以降のPIAは人が作っているから、人為的に「Microsoft.Office.Interop.Excel」と名付けてられているだけ。COMにネームスペースの概念はないため自動生成で付く筈も無い。
 そういうわけで、ネームスペースが異なるからExcelXp以降の入ったマシンで動作しないというのは誤り。ネームスペースを提供しているのは.NETのアセンブリなだけでラップしている実体のCOMには関係のないことだ。IAのDLLに直接依存しているのは「.NET製のユーザープログラム」なだけで、IA-DLLはOfficeのCOMライブラリではCOMがバージョン互換性がある限り問題がない。そうでなければ、自動生成したIAで異なるバージョンのExcel Object Libraryを扱うことができるという理屈が成り立たない。
 では、ExcelXP,2003などが入ったマシンでVisualStudioから作成した成果物が他のマシンでそのまま動かないのは何故かというと、「.NET製のユーザープログラム」がGACにPIAがあることを前提として実行しようとするから。VisualStudioのビルド出力ディレクトリにはPIAのDLLは付属されない。GACにあるのにワザワザ複製を持つ必要がないからだ。Excel2000のマシンでビルドした際に出力ディレクトリに生成されるIA-DLLも、もちろん他のマシンに持ち運ばなければ動作はしない。
 というわけで、Visual Stdioのセットアッププロジェクトでは*1インストーラに付属させてGACにPIAがなければインストールするというセットアッププログラムが走るようになっている。
 PIAを再配布するということが正しいアプローチではあるが、GACに登録せずに唯のローカル参照アセンブリとして利用するという方法も取れるんじゃないだろうか。OfficeXpのPIAを開発プロジェクトの中にコピーして相対参照して扱えば出力ディレクトリに一緒にコピーされるし、Excel2007がインストールされているマシンにそのセットを持っていけばインストーラ不要でGACに登録せずに問題なく動作するはずだ。IA-DLLのファイルサイズなんて何メガもあるわけじゃないし*2……理論上は…ですので、ExcelXp以降の誰か、ためして確認してほしいなぁ。

*1:というかOffice COMアドインのプロジェクトテンプレート

*2:Excel2000では、Interop.Excel.dll 924kb、Interop.Office.dll 152kb、Interop.VBIDE.dll 56kbでした。これらが依存するIAとしてビルド出力ディレクトリに吐き出されてます。