6

Oracleデータベースと通信するためにNHibernateを使用する必要があるプロジェクトがあります。

私の職場の多くのプロジェクトはNHibernateを使用しているため、NHibernateアセンブリはグローバルアセンブリキャッシュに配置されました。これは私が完全には理解していないツールです。私の調査から、私は以下を集めました:

  1. グローバルアセンブリキャッシュは、多くのプロジェクトによって参照されるdllの中央リポジトリです。これにより、DLL地獄の問題が回避されます。dllの新しいバージョンがリリースされると、キャッシュ内で1回更新され、それを参照するすべての.NETプロジェクトが新しいバージョンを使用するようになります。
  2. アセンブリキャッシュにアセンブリへの参照を追加することはできません。「GACに登録されているアセンブリは、[参照の追加]リストに表示されません」。ただし、レジストリを切断することで、強制的に表示させることができます。
  3. アセンブリキャッシュにアセンブリへの参照を簡単に追加できます。「[参照の追加]ウィンドウを使用して、GACにインストールしたアセンブリへの参照を追加するだけです」。([参照の追加]ウィンドウにGACアセンブリが表示されないため、これを信じない傾向があります)。
  4. 私の職場のいくつかのプロジェクトには、GACの多くのアセンブリへの参照があります。これらのアセンブリは[参照の追加]メニューに表示されないため、前任者がレジストリマングリング手法を使用していなかったことを私は知っています。それでも、それらは明らかにGACに由来します-それらのファイルパスはC:\ Windows\assemblyのサブディレクトリです。

ポイント2は明らかに他の3つと矛盾しますが、それが単に誤りであれば、ライブラリを参照するのに問題はありません。私のGACアセンブリが[参照の追加]ウィンドウのどこにも見つからないという現実を確実に反映しています。

私は2つのことを知りたいです:

  • 開発者はいつGACを使いたいと思うでしょうか?レジストリのトリックなしでは参照できないライブラリは何が良いのでしょうか?
  • レジストリに触れることなく、前任者がGACのライブラリを参照するためにどのような手順を実行しましたか?
4

5 に答える 5

5

そして、それを参照するすべての.NETプロジェクトは、新しいバージョンを使用するようになります。

いいえ、それはDLL地獄と呼ばれています。アプリケーションは、アセンブリの特定のバージョンを参照します。DLLを更新し、それを使用するアプリケーションを更新できます。また、そのDLLを使用しているが、再コンパイルされなかった古いアプリケーションを壊さないでください。DLLの複数のバージョンを格納できるため、GACを使用してこれを行うことができます。または、DLLをアプリケーションのEXEと同じディレクトリに保持することで、これを簡単に行うことができます。

GACのアセンブリは、[参照の追加]ダイアログに表示されません。必然的に、ユーザーがGACに何を保存したかがわかりません。代わりに、開発マシンの[参照]タブを使用するので、DLLの特定のビルドを使用することが確実になります。

GACは、セキュリティ更新プログラムを配布する必要がある企業にとって重要です。マイクロソフトのように。これにより、パッチが適用されていないDLLのコピーが浮かんでいないことが保証されます。[ComVisible]アセンブリがCOMのDLL地獄の問題を解決するためにも重要です。それについてです。

于 2011-10-19T13:47:50.313 に答える
3

プロジェクトにGAC参照を追加する「力ずくの」方法は、プロジェクトファイルを直接編集することです。Referenceプロジェクトをアンロードし、プロジェクト内の他の参照と同じItemGroup要素の下にを追加します。次に例を示します。

<Reference Include="System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
</Reference>

[参照の追加]ダイアログの[.NET]タブでのアセンブリの設計時の場所と、GACでのアセンブリへの参照の実行時の解決には違いがあることに注意する必要があります。.NETタブとファイル参照タブを介して参照を追加することの違いは、前者の場合の参照は「ローカルコピー」としてマークされていないため、実行時にGACから検索されることです。Microsoftは通常、GACから参照することを目的としたアセンブリのコピーを%programfiles%\ Reference Assembliesディレクトリの下のフォルダに配置しますが、これらは設計時にのみ使用されます。

于 2011-10-19T13:44:02.593 に答える
1

1 ....キャッシュ内で一度更新すると、それを参照するすべての.NETプロジェクトが新しいバージョンを使用するようになります。

ではない正確に。アプリが新しいバージョンと古いバージョンのどちらを使用するかを制御できます。気の利いたことは、両方が同時にGACに存在できることです。

  • レジストリに触れることなく、前任者がGACのライブラリを参照するためにどのような手順を実行しましたか?

単にa)に登録しGacUtil /i、b)参照を追加し、元のdllの場所を参照します。c)新しい参照にCopyLocal=falseおよびStrongName=trueがあることを確認します

于 2011-10-19T13:45:30.240 に答える
1

これは、私の前任者がGACのアセンブリへの参照を追加した方法のようです。

  1. GACでアセンブリへの参照がすでに含まれているプロジェクトを開きます。
  2. 参照を選択し、[プロパティ]ペインを開きます。
  3. 参照のフルパスをコピーします。
  4. ターゲットプロジェクトで、[参照の追加]を選択し、[参照]タブを選択します。
  5. フルパスを[ファイル名]テキストボックスに貼り付けて、[OK]を選択します。

しかし、他の答えを見ると、これが良い考えだとは思えません。開発、テスト、および実稼働環境のGACがすべて同一であるのは偶然です。GACが同期されていない場合、参照はおそらく有効なままではありません。

于 2011-10-20T16:04:26.127 に答える
0

答えるには遅すぎるかもしれませんが、私はこれを行うための非常に簡単な方法を見つけました(ハックなしで)。

  1. dllをGACに配置します
  2. GoToプロジェクト->プロパティ
  3. [参照パス]をクリックして、GACのパスを設定します
  4. とビルド

それが役に立てば幸い

于 2015-06-19T15:02:44.147 に答える