GACは、その役割[RPM]を理解します

転送:  http://www.cnblogs.com/smallstone/archive/2010/06/29/1767508.html

 

、GACの役割

      その上で、例えば、使用するプログラムの多くを持ってSystem.Data、のSystem.Windows.Formsといくつかの公共のアセンブリを格納することで、グローバルアセンブリキャッシュの役割を表します。このように、多くのプログラムはすべて、以下のアプリケーションの実行ディレクトリにコピーされているアセンブリを使用することなく、その後GACからのアセンブリの中に入る、とすることができます。何GACがない場合、それは各ディレクトリのWinFormプログラムにバインドされているたとえば、Cからなります:\ WINDOWS \ Microsoft.NET \ Frameworkの\のvX次はのSystem.Windows.Forms.dllをコピーし、これは明らかに、すべてのほど良好ではありません便利なだけでなく、助長アセンブリのアップグレードとバージョン管理へのアクセス内部GAC。

第二に、厳密な名前付きアセンブリ

     これらのアセンブリが同じ場合にディレクトリにコピーされている場合は、別の企業は、に設定され、同じ名前のプログラムを開発する可能性があるため、最終的な組み立ては、以前のアセンブリの場所にインストールされます。有名なWindowsの「DLL地獄」が登場理由です。

  もちろん、単にアセンブリが十分ではありません区別するために、ファイル名を使用し、CLRは一意にアセンブリを識別するためのメカニズムをサポートする必要があります。これは、厳密な名前付きアセンブリと呼ばれます。

  (拡張子なし)、ファイル名、バージョン番号、言語と文化の情報(もしあれば)、公開鍵:厳密な名前付きアセンブリは、アセンブリの4つの固有の特性の兆候が含まれています。

  リスト情報はでアセンブリ(マニフェスト)に格納されています。リストには、メタデータのアセンブリが含まれており、アセンブリ内のファイルに埋め込まれました。

  次の文字列は、4つの異なるアセンブリファイルを識別します。

  「がMyType、バージョン= 1.0.1.0、

  カルチャニュートラル、PublicKeyToken = = bf5779af662fc055”

  「がMyType、バージョン= 1.0.1.0、

  文化= EN-US、なPublicKeyToken = bf5779af662fc055”

  「がMyType、バージョン= 1.0.2.0、

  文化= neturl、なPublicKeyToken = bf5779af662fc055”

  「がMyType、バージョン= 1.0.2.0、

  カルチャニュートラル、PublicKeyToken = = dbe4120289f9fd8a」

  同社は、アセンブリの一意のIDを望んでいるなら、それは最初の公開鍵/秘密鍵のペアを取得する必要があり、その後、キーと関連するアセンブリがあります。それは競合を引き起こすことなく、この区別は、私たちは、同じ名前、アセンブリのバージョン、および言語と文化の情報を作成することができますです、何の両社は、状況の同じ2つの公開鍵/秘密鍵のペアを持っていませんがあります。

  厳密な名前付きアセンブリに対応する弱い名前のアセンブリと呼ばれています。(実際には、一般的には、厳密な名前付きアセンブリではありません)。アセンブリの二種類の構造は同じです。同じPEファイル形式、PEヘッダ、CLRヘッダー、メタデータ、およびマニフェスト(マニフェスト)を使用します。公開鍵/秘密鍵である厳密な名前のアセンブリの発行者の公開鍵/秘密鍵の署名は、一意のアセンブリの発行者が識別される2つの間の本当の違いがあることです。アプリケーションは、CLRができる厳密な名前のアセンブリ時間をバインドしようとするように、我々は、プログラムセットの一意性を識別するセキュリティポリシーとバージョン管理戦略、一意のアセンブリを特定する能力を強化することができ、公開鍵/秘密鍵のペアを使用します特定の実装では、(例えば、唯一の企業のアセンブリを信頼)戦略「のセキュリティを確認されました」。

第三に、どのように厳密な名前付きアセンブリを作成するには、なPublicKeyTokenはどのように厳密な名前のアセンブリを参照してください

厳密な名前付きアセンブリを作成する方法

===================

1. Visual Studioで、クラスライブラリプロジェクトを右クリックして[プロパティ]を選択します。

[署名]タブの左を選択します。

ログインに組み立てボックスを選択します。<新...>ドロップダウンリストを選択します。

2010年2月7日9-09-21 PM

SNKファイルにダイアログボックス名4.。[OK]を押します。

2010年2月7日9-10-23 PM

完全な厳密な名前付き。

2010年2月7日9-12-32 PM

どのように私は、厳密な名前付きアセンブリの公開キートークンを見ることができます

=========================

時にはあなたは、あなたがこの完全修飾名のように記述する必要が自分自身を書くためにweb.configファイルまたは他の場所で参照厳密な名前のアセンブリに必要があります。

MyNamespace.MyAssembly、バージョン= 1.0.3300.0、カルチャニュートラル、PublicKeyToken = = b77a5c561934e089

最初の三つの部分あなたが書いたので、入手しやすく、あなたは確かに、アセンブリの名前、バージョン、およびカルチャ情報を知っている。面倒部分はアセンブリの公開キートークンの彼の署名を取得する方法である。共通の一種使用することですリフレクターを独自のアセンブリを開き、(実際には、トークンを取得するために  リフレクターがあなたの上記の例のようにのような完全な情報を提供します)が、時にはまだ少し行き過ぎと思われる。あなたが開いている場合Visual Studioの、VSのみメニューポイントにメニュー項目が答えを得ることができるようになりますが、より良いではないでしょうか?ここでの手順です。

Visual Studioで1、[ツール]メニューを開き、[外部ツール]メニュー項目をクリックしてください。

外部ツール]ダイアログボックスで、[追加]ボタンをクリックしてください。

3.次の図を設定します。ます。SN.exeにVSフォルダの異なるバージョンの異なるファイルでこのツールを。最も簡単な方法は、それが入力することで検索し、「どこます。SN.exe」パラメータボックスで、VSコマンドプロンプトで、その後、出力ウィンドウVSで[OK]をクリックします。この場合、結果はとなります。その後、「出力ウィンドウを使用する」にチェックを入れてください。「-T $(TargetPathが)」書かれていました

2010年2月7日9-27-57 PM

図4に示した結果。

2010年2月7日9-33-28 PM

5. 在输出窗口可以看到结果. 这在你的solution里有多个project的时候也是可以正常工作的. 只需要点击一下Solution Explorer中的Project, 然后点击我们的菜单项就可以了.

2010年2月7日9-35-31 PM

四、如何将自己的dll注册到GAC中

在开发和测试中,最常用的工具就是GACUtil.exe。 在GAC注册程序集跟COM注册差不多,但相对更容易:
    1.把程序集添加GAC中: GACUtil /i sample.dll (参数/i是安装的意思)
    2.把程序集移出GAC GACUtil /u sample.dll (参数/u就移除的意思)
注意:不能将一个弱命名程序集安装GAC中。
如果你试图把弱命名程序集加入GAC中,会收错误信息:”
    Failure adding assembly to the cache: Attempt to install an assembly without a strong name”
    d)强命名程序集的私有部署

例子

C:\Program Files\Microsoft Visual Studio 8\VC>gacutil -i F:\myweb\BalloonShop\Cl
assLibrary1\bin\Debug\ClassLibrary1.dll

画像

在C:\WINDOWS\assembly将会看到ClassLibrary1,注册成功

画像

五、查看GAC文件内容以及将DLL复制出来

在项目中我们常常会引入第三方的dll,一般情况下我们都可以将所需的dll文件复制到硬盘上的一个地方,然后在项目中添加引用,这个操作很简单!但有时候我们会遇到这样的情况,就是所要引用的dll在目标机器的GAC里,这时我们就不能手动将它拷贝出来了。

      其实Windows的GAC是有对应的目录的,一般来说为c:\Windows\assembly\,这个目录有一些特殊,它里面存放的是本机已安装和注册的类库dll,并且不允许用户直接对其中的元素进行相关操作(如复制、剪切、粘贴、修改名称等),不过你可以直接将另一位置的dll文件直接拖放到这个目录下进行dll的安装,但是我们不能直接将已经安装进去的dll再拷贝出来。这里我将介绍一种方法来完成这个操作。

2009年6月19日10-12-55 AM

首先我们切换到Windows的命令行方式,即开始-运行-cmd-回车,然后转到GAC所在的目录,利用dir命令查看一下其中的内容,如下图。

2009年6月19日10-24-50 AM 似乎可以明白GAC中的目录结构了,基本上我们可以根据GAC目录中的Processor Architecture列来区分dir的类型,例如我们要找的System.Web.Extensions属于MSIL,在CMD方式下它应该就对应GAC_MSIL,然后切换到这个目录下并dir。

2009年6月19日10-56-42 AM

看到我们要找的System.Web.Extensions程序集了,它也是一个dir,继续切进去并dir。

2009年6月19日10-59-47 AM这时只有一个目录了,继续切进去,然后dir就可以看到我们最终想要的dll文件了,然后通过copy命令将它复制出来就OK了!

2009年6月19日11-02-37 AM

ヒント:あなたは、ファイル名を入力するか、ディレクトリ名が長すぎる場合は、CMDコマンドモードを使用するときは、一部の文字をノックすることができ、その後、自動的に[Tab]キーを完了し、Windowsが自動的に何が一致コマンドツールがあります!

6つの例

画像

上に示したように、2つの新しいライブラリファイル:ClassLibrary1の、ClassLibrary2

上記使用1、第三の点を強力に作成するためには、ClassLibrary1のアセンブリを入力し、GACに登録(第3点法は、上記で使用することができるデコンパイラをコンパイルするためにも使用することができ、なPublicKeyToken値がヌル.ClassLibrary2で表示することができ、ClassLibrary1のは)568e03e6162a7a2eです。

2、参照ClassLibrary1の、ClassLibrary2は、DATAACCESSにDATAACCESSをコンパイル。

3、のみClassLibrary2.dllとDataAccess.dll(なしたClassLibrary1.dll)、下DATAACCESSプロジェクトのbin \ debugフォルダに

それは見ることができます。プログラムは、のGACたClassLibrary1.dllから直接取得されるのではなく、独自のデバッグ中に参照できるようにClassLibrary1の工学たClassLibrary1.dllからそれをコピーします。

ます。https://www.cnblogs.com/Jenny90/p/3507455.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34367257/article/details/93566834