2009年11月23日月曜日

Visual Studio 2008 Tools for Office (VSTO SE) と Office2003

EXCEL起動時にWindowsフォームを表示し、フォーム内でSQLSERVERからデータ取得するSQLを動的生成し、EXCELグラフのネタ数値を設定するだけの単純なプログラムです。運用PCで動作したので一旦、備忘録へ。

今回EXCELを扱いますが、周りで2007Officeを使用している人が皆無に近いので、2003Excelで作成しました。しかし現在新たにPCを購入するとOffice2007しか選択出来ません。今後を考えると2007で作れば良かったかも知れません。
しかし・・・
大問題が発生し、結果、2003(.xls)と2007(.xlsx)の2つのアプリケーションを作成してしまい・・事前準備に不備があったようで、丸2日無駄にしてしまいました。が、両方覚えられたので、良かったかもしれません?



= 開発環境 =
VS2008 Pro, VSTO Excel 2003 Book, C#, SqlServer2005(2008) Std, XP Pro SP3(VISTA Pro)
注意点:
 試していませんがVSTO開発は、VS2008エディションPRO以上でないと作れないそうです(STD、EXRESS、はNG。VSのPRO以上を購入する必要あり)。VS2005の場合はどうなのか不明ですが、多分Pro以上と想像されます。

= 動作環境 =
PC:XP SP3,Office2003Std,Windowsドメイン参加(Windows認証)
DB Server:ドメイン上のSqlServer2005 STD
注意点:
 動作するPC上(配布先のPC)の、Officeエディションは、Office2003 Pro以上のエディションか、EXCEL単体パッケージでないと動かないそうです。


 要するに、Office2003スタンダードやOffice2003パーソナルエディションがインストールされたPCで、VSTOで作ったExcel 2003Bookアプリケーションは、動作しません。当該Excelをダブルクリックしても、普通にエクセルが立ち上がり、普通にExcelとして使えるだけです。書いたコードはウンともスンとも言いませんので、この事を知らないと、相当時間or日数、悩み続けます。怖いです・・。
アドインなら、配布先PCで、VSTO SEのインストールで、Office2003STDで動くとの事です。
(参考)http://www.microsoft.com/japan/msdn/vstudio/office/productinfo/faq/ 下から2つ目のQA

 これが発覚した大問題で、結局、全く同じ内容の2007Excelアプリを作らなければならなくなった原因でした。VSTO V3であれば、動作させるPCのOfficeエディションによる制約は、なくなったそうです。実際、Office2007STDで動作確認しています。という事は、VSTO V3(2007Office)以外の選択肢はないのでは?と思います。


= 肝 =
VSTOで作るOfficeソリューションの肝は、配置です。
アプリケーション自体、ただのC#アプリですが、配置は中々厄介。アセンブリやらマニフェストやら配置モデルやら、職業プログラマが、普段あまり意識しない要素が色々と面倒。MSDNの説明も、細かく、多く、何処まで読めば良いのか?全てか?。チュートリアルだけで事が済めば幸せですが、どんな風になっているかを理解するには、少しの苦しみが必要です。そして使用するPC側のセットアップも。配布先PCで、動作させる事が、最初は一苦労です。



= 制作 =
プログラム自体は単純。元となるExcel2003のBook(.xls)は予め作成済みでした。まずVS2008でOffice2003のExcelBookプロジェクト作成をクリック。アプリケーションのドキュメント選択で既存のドキュメントをコピーするをクリックし、既存のドキュメントの完全パスは、予め用意したxlsを指定。

最終的には、こんな感じ。配置は手作業(バッチファイルを利用)
※エクセルにSheet2,3がないのは、元のExcelになかったから。シートが1枚だけでも、特に問題は出ません。

 上記の仕様は、Excel起動時のsutartupイベントで(ThisWorkbook.cs)、Winフォームを開き、フォームにあるボタンpushをトリガーとし、フォームで入力された値を元に、DBへクエリします。楽をするため、データ取得は、テーブルアダプタにお任せして、データセットへデータを取得してもらいます。それをエクセルの折れ線グラフが参照する、複数のセルへ、取得したデータをセット。するとExcelが勝手にセルの数値を元に、グラフの折れ線を作ってくれる。たったこれだけ。(設定値のないセルには #N/A と設定すると、グラフの線が途切れず繋がります)

以下は、配置パターン2のケースで、Windowsインストーラ(.msi)を使って配置します。カスタムアクションを追加して、インストール処理をオーバーライドして、マニフェストを設定しています。
(参考)http://msdn.microsoft.com/ja-jp/library/ms268758.aspx


 色々書こうと思いましたが、、、私的には、2003Officeは、パーソナル・エディションやSTDを使っている人しか知らないため、VSTOで作ったOffice2003Excelアプリは・・・99%使い物にならない、と言う印象です。プロ以上を買ってくれ、でないと動きません。そう客に言えばOKでしょうが、、、

 一応、手作業配置で使った、バッチファイルを添付します。CasPol.exe(コード アクセス セキュリティ ポリシー ツール)を利用し、事前設定を行うことで、Excel実行時のエラーを回避します。
例)caspol -u -ag All_Code -url "C:\インストール・フォルダ\ConditionGraph.dll" FullTrust -n "ConditionExcelGraph"


 要は、インストールしたフォルダ、・・・利用者のPCの、何処かのフォルダ:インストールフォルダ:に、一式(ビルドしたソリューションの、\bin\Debugか、\bin\Releaseフォルダの中の全て:.pdpはイラナイ)をCOPYするだけ・・・、内のアセンブリ対し、完全信頼(Full Trust)アクセス許可を付与すれば、エラーは消え、動きます。



絵で見ると、以下になります。


「Microsoft Office ソリューションを配置して実行するには、各エンド ユーザーまたはコンピュータのセキュリティ ポリシーで、アセンブリに完全な信頼を付与する必要があります。」by MS


それと、配布先のPCに、以下をお忘れなく。
1.1 Microsoft .NET Framework Version 2.0 再頒布可能パッケージ
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5
1.2 Microsoft .NET Framework 2.0 日本語 Language Pack
http://www.microsoft.com/downloads/details.aspx?familyid=39C8B63B-F64B-4B68-A774-B64ED0C32AE7&displaylang=ja
2. Office 2003 製品用のプライマリ相互運用機能アセンブリ(officeをフルインストールしていれば、既にインストールされています)
http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&displaylang=en
3.1 Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime (VSTO 2005 SE)
http://www.microsoft.com/downloads/details.aspx?familyid=F5539A90-DC41-4792-8EF8-F4DE62FF1E81&displaylang=ja
3.2 Microsoft Visual Studio 2005 Tools for the Microsoft Office System (VSTO2005) 再頒布可能パッケージ Language Package
http://www.microsoft.com/downloads/details.aspx?familyid=D64BA959-82C5-42CD-9AF7-BD57F6EFF12C&displaylang=ja

(詳細)
http://msdn.microsoft.com/ja-jp/library/2ac08ee2.aspx



 と言う事で、上記、= 制作 =の(参照)にあるチュートリアルの通り行うだけで配置先PCで動いてしまったので、少々拍子抜けでした。
 手動配置の場合も、ソリューションのビルドで出来たフォルダ内を配置先PCへコピペし、そのフォルダ下にFullTrustを与えるだけで動いたので、VSTOの配置は難しい・・と言う通説?は何だったのだろう・・と言う印象です。

しかしFullTrustは名前の通りFullTrustですから、最小限のファイルにのみ与える方が気持としては良いと思います。ただ本気で来られたら、なすすべないようにも思いますので、FullTrustは所詮FullTrustだと思います。


0 件のコメント:

コメントを投稿