2013年7月8日月曜日

.NET(C#)でMS Office(Excel)のバージョンに依存しないアプリを作る

以前作ったツール(C#からExcelを使う)が別の環境で動かないと言われ、調べたらMS Officeのバージョン違いだった(2007→2010)。最初にその話を聞いたとき、詳しい情報を聞いていなかったので、とりあえず自分のところ(MS Office 2013)でビルドしなおしたのを送ってもダメだったいうので、エラーメッセージ聞いたらわかった。

私が知っていたこの依存を無くす方法は、遅延バインディングを使うかCreateObject使うとか型情報が使えなくて面倒なやつばっかりだったので、このツール以降に作ったExcelを使うやつはどうせ型情報使えないのならとIronPythonを使っていました。とはいえ、C#で書いてあるのを書き直すのも面倒なので、他に方法が無いか調べたところ、MSのサイトにチュートリアル: Microsoft Office アセンブリからの型情報の埋め込み (C# および Visual Basic)というのがあり、同じこと(Embed interop types)をSharp developでやってみたところ、2点ほどはまりどころがあったものの動くようになりました。

問題があったところ

  1. Microsoft.CSharpを参照に追加しないとコンパイルエラーになる
  2. ビルド環境が.NET 4.5で、実行環境が.NET 4.0だと実行時エラー。エラー情報で検索してStackOverflowでExcel interop MissingMethodExceptionを見つけたので、.NET 4.5を消して4.0にしたら解決した。

後者はWindows 8(.NET 4.5)環境では解決できないので、対象環境を4.5にするのが良いのだろうか。ターゲットを3.5にしたらコンパイルできなかった(Embed interop typesがC#4.0からだから)。

今後は.NET 4.0以降を対象にOfficeのバージョンに依存しないアプリを作る場合は、この方法が使えそうです。事前バインディングだと補完が出来るし、実際かなり楽なのでもう戻したくありません。

(追記)
4.5の環境に4.0のリファレンスアセンブリをインストールしてビルドしたものは、4.0がインストールされているところで動かなかったので、4.5環境で4.0環境用にビルドするのは多分無理なんだろう…。しばらく4.0の環境をとっておくしかなさそう…。

0 件のコメント:

コメントを投稿