2009年7月26日日曜日

[.NET]EXEと依存DLLは同じフォルダに配置せよ+ライセンス違反に注意!

久しぶりに技術ネタを。といっても非常に低レベルですが。
Visual Studioのセットアッププロジェクトにて、.NETアプリのインストーラを作成した時の話。

そのアプリではLineShapeやReportViewerコントロールを使用していたので、依存DLLとしてVisualBasicPowerPacksやReportViewer関連のDLL等がくっついてきました。こいつらEXEと同じ位置に配置されるのですが、結構数が多く見にくかったので整理整頓したい欲求に駆られてしまい、「lib」ってフォルダを作成しその中に全部移動させました。

総合テスト時、テスト実行端末にインストールして起動してみると、問題なく起動・実行できました。ところが、その後のクライアント環境インストール作業のリハーサルでは起動しませんでした。エラーメッセージは「ライブラリが見つかりません」的な内容。どうやら「VisualBasicPowerPacksのDLLが見つからん!」とお怒りのようだ。そういえばスタートアップフォームでLineShapeコントロール使ってたな。でもインストーラには含めているのに、何でだ?PATHが通ってないのか?
起動しなかった理由は、当エントリのタイトルで既に言っちゃってますが、
「DLLをEXEと同じフォルダに配置していなかったから」
でした。

でも何で総合テストの時は起動できていたのだろうか?
このプロジェクト、元々スケジュールに余裕が無かったので、結合テストと総合テストを一緒くたに行うことになっていました。つまり、モジュール間の動作検証と、実業務に即した流れでの動作テストを同時に行うということです。これで良く無事に済んだな(今の所、リリース後のバグ報告無し)。
という訳で、総合テストはユーザーと同じ環境の端末ではなく、開発端末で実施することになりました(結合テストで検出したバグをすぐ直さなきゃならないので)。開発端末なのでVisual Studioがインストールされており、前述のDLLはPATHの通っている場所に配置されています。よって、総合テストでは問題無く起動し、気付かなかった訳です。

ちなみに、ReportViewerに関しては、ツールバーの表記等が英語になってしまったので、結局クライアント環境に再頒布パッケージと言語パックインストールすることになったんですけどね。

<後記>
ところで、クライアント環境のインストール作業のリハーサルは、元々行う予定ではなかった。大したことないと見なされていたので(サーバー環境のはさすがに行う予定でしたが)。僕が勝手に裏でこっそりやったことだった。もし高を括って予定通りにリハーサルを行わず客先に行ってたら…と考えたら、冷や汗ものでした。

2009年9月27日 追記

コメントにて「redist.txtを読め」とのご指摘を受けました。果て何のこっちゃ?と調べてみた所、どうやらインストーラに含めてよいファイルが記載されているとの事。つまり、このファイルに記載されていないDLL等は、インストーラに含めてはならず、含めて配布してしまった場合はライセンス違反になってしまう!

あ、危なかった…前述のプロジェクトでは、結局含めなかったんですよ。前述した通り、ReportViewerで問題が発生したので、VBPowerPacksも知らない所で問題が発生すると厄介だなという事になり、結局どちらもクライアント環境でセットアップするという形を取ったので。

尚、このファイルの場所ですが、Visual Studio 2008の場合、「C:\Program Files\Microsoft Visual Studio 9.0\1041」内にあります。

ここで言い訳を。インストーラ作成にはここ参考にVisual Studioのセットアップウィザードを使用し、(確か)「プライマリ出力」にチェックしただけの筈ですが、ReportViewerとPowerPacksのDLLは(確か)勝手に追加されていました。Microsoftの正規ツールを使用して勝手に追加されたこいつらが、配布してしまうとライセンス違反になってしまうなんて、思ってもみないですよ。配布してはいけないものは除外してくださいよ、Visual Studio。

ところで、プロジェクトメンバー全員がこの事全然知らなかったんですけど、これって有名・当たり前なレベルの事なんですかね?

2 件のコメント:

匿名 さんのコメント...

それ以前の問題として、redist.txtを読むべし。

おもくそ さんのコメント...

Re:匿名さん
redist.txtというものの存在、恥ずかしながら存じませんでした・・・
ReportViewerとPowerPackのDLLは、そもそもインストーラに含めてはいけないのですね。

非常に勉強になりました。
どうもありがとうございました