web-dev-qa-db-ja.com

グローバルアセンブリキャッシュ内のMicrosoft.SqlServer.Types.dll?

現在、Microsoft.SqlServer.Typesとそれに関連するアンマネージライブラリSqlServerSpatial110.dll-Microsoft SQL Server 2012の両方で発生する展開の問題に苦労しています。問題は簡単に解決でき、典型的な行方不明のDLL問題だけですが、完璧な処理方法を決定しようとしていますこれらの依存関係。

まず、どちらかのライブラリを手動でデプロイする(通常は、プロジェクトの出力ディレクトリにコピーするか、恐ろしいことに、System32自体に)正しいという世論に同意しないことを宣言する必要があります。マイクロソフトはこれらのファイル用に再配布可能なMSIインストーラーを提供しており、それらのインストーラーはファイルをシステムの場所に配置します。個別に、またはMSI自体に組み込まれているテスト済みの依存関係メカニズムの一部としてインストールされている再配布可能ファイルに依存することを望んでいることは明らかです。

投稿時に、これらの再配布可能ファイルの最新バージョンは次からダウンロードできます。 http://www.Microsoft.com/en-gb/download/details.aspx?id=43339

SqlServerSpatial110.dllの場合、問題はないようです。 MSIインストーラー(プラットフォーム固有)は、ファイルをWindows\System32またはWindows\SysWOW64のいずれかに適切にドロップし、すべて正常です。

マネージラッパーライブラリMicrosoft.SqlServer.Types.dllは、より混乱します。

ファイルがグローバルアセンブリキャッシュにドロップされたようです。MSIを実行した後、自分のマシンでC:\Windows\Assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dllにファイルがあり、そのファイルのバージョンと更新日が正しいことがわかります。

奇妙なことに、Visual StudioのリファレンスブラウザーやWindowsエクスプローラーで直接表示することはできません。Mythicsoftによる非常に古い形式のファイルシステム検索ツールでのみ表示されます。 なぜ表示されないのですか?

ファイルはGACでほとんどなので、それを参照するプロジェクトはしないでくださいそれのローカルコピー-ターゲットシステム上にあることを前提とする必要があります。私はこの仮定をテストし、それはうまくいきました:

  1. Microsoft.SqlServer.Types.dllの場所からC:\Windows\Assembly\GAC_MSILを手動でコピーします
  2. コピーへの参照を追加します。
  3. 参照のCopy LocalFalseに設定されていることを確認してください
  4. プロジェクトをビルドし、Microsoft.SqlServer.Types.dllが出力に含まれていないことを確認します。
  5. テストプロジェクト...問題なし!

したがって、この依存関係を満たすために、実行時にGACからアセンブリを解決できる場合、参照を追加するときに参照ブラウザーにアセンブリが表示されないのはなぜですか? GACからコピーして参照する必要があるのはなぜですか?

私の考えでは、理想的なワークフローは次のようになります:

  1. 開発マシンに再配布可能なMSIをインストールします。
  2. 製品がMSI経由で展開されている場合はMSI依存関係としてリストするか、「xcopy」展開を使用している場合は手動でインストールすることにより、再配布可能ファイルがターゲットマシンにインストールされていることを確認します。
  3. フレームワークライブラリと同じように、参照ブラウザーを使用してGACからMicrosoft.SqlServer.Typesを参照します。 (Copy LocalはデフォルトでFalseに設定されます。)
  4. 実行時に、Microsoft.SqlServer.Types(プラットフォームに依存しない)はGACから解決され、プロセスアーキテクチャに応じて、管理されていないライブラリの適切なコピーがシステムの場所から読み込まれます。
  5. 心配ない!

明らかに、ステップ3は発生しません。何か不足していますか?おそらく私はGAC自体を誤解している-それは初めてではないだろう。なぜマイクロソフトはこのようにしたのですか?理想的なワークフローに近づけることはできますか?

おそらく、この依存関係を管理するまったく異なる方法があるでしょう-私が明らかに考えていないものです。もしそうなら、それは何ですか?それをどのように扱いますか?

15
Xharlie

これがワンクリック展開の場合は、[プロジェクト|プロパティ|公開]タブに移動し、[アプリケーションファイル...]ボタンをクリックします。次に、依存ファイルを選択し、[発行ステータス]の値で[インクルード(自動)]が選択されていることを確認します。その理由は、VSはファイルが既知の再配布可能ファイルの一部であるかどうかを判断するのに十分スマートであり、これにより、インストール中に依存関係として外部パッケージに依存するか、ファイルを自分で管理するオプションを提供するためです。パッケージに依存している場合、エンドユーザーはプログラムの追加と削除を介してアンインストールでき、アプリは無効化されます:/

3
Ross Bush