現在、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でほとんどなので、それを参照するプロジェクトはしないでくださいそれのローカルコピー-ターゲットシステム上にあることを前提とする必要があります。私はこの仮定をテストし、それはうまくいきました:
Microsoft.SqlServer.Types.dll
の場所からC:\Windows\Assembly\GAC_MSIL
を手動でコピーしますCopy Local
がFalse
に設定されていることを確認してくださいMicrosoft.SqlServer.Types.dll
が出力に含まれていないことを確認します。したがって、この依存関係を満たすために、実行時にGACからアセンブリを解決できる場合、参照を追加するときに参照ブラウザーにアセンブリが表示されないのはなぜですか? GACからコピーして参照する必要があるのはなぜですか?
私の考えでは、理想的なワークフローは次のようになります:
Microsoft.SqlServer.Types
を参照します。 (Copy Local
はデフォルトでFalse
に設定されます。)Microsoft.SqlServer.Types
(プラットフォームに依存しない)はGACから解決され、プロセスアーキテクチャに応じて、管理されていないライブラリの適切なコピーがシステムの場所から読み込まれます。明らかに、ステップ3は発生しません。何か不足していますか?おそらく私はGAC自体を誤解している-それは初めてではないだろう。なぜマイクロソフトはこのようにしたのですか?理想的なワークフローに近づけることはできますか?
おそらく、この依存関係を管理するまったく異なる方法があるでしょう-私が明らかに考えていないものです。もしそうなら、それは何ですか?それをどのように扱いますか?
これがワンクリック展開の場合は、[プロジェクト|プロパティ|公開]タブに移動し、[アプリケーションファイル...]ボタンをクリックします。次に、依存ファイルを選択し、[発行ステータス]の値で[インクルード(自動)]が選択されていることを確認します。その理由は、VSはファイルが既知の再配布可能ファイルの一部であるかどうかを判断するのに十分スマートであり、これにより、インストール中に依存関係として外部パッケージに依存するか、ファイルを自分で管理するオプションを提供するためです。パッケージに依存している場合、エンドユーザーはプログラムの追加と削除を介してアンインストールでき、アプリは無効化されます:/