GACからアセンブリを抽出する方法は?


134

アセンブリをGACに直接インストールする(たとえば、%windows%/ assemblyのどこかに深い)対処しなければならないパッケージがあります。

GACから通常のファイルシステムに実際のアセンブリ(DLL)を削除するにはどうすればよいですか?

ありがとう。

回答:


150

この記事のアドバイスを使用して、GACからアセンブリを取得しました。

GACからDLLを取得する

GACに展開されたDLL(通常はc:\ windows \ assemblyにある)は、通常のDLLファイルとして表示または使用できません。VSプロジェクトから直接参照することはできません。開発者は通常、元のDLLファイルのコピーを保持し、開発(設計)時にプロジェクトでそれを参照します。これは、プロジェクトの実行時にGACからのアセンブリを使用します。

実行時(実行時)にアセンブリが署名され、GACに展開されていることが判明した場合、CLRは、VSの設計時に参照されるDLLではなく、GACからアセンブリを自動的に取得します。開発者が元のDLLを削除したか、何らかの理由でそれを持たない場合、GACからDLLファイルを取得する方法があります。GACからDLLをコピーするには、次の手順に従います。

  1. regsvr32 / u C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dllを実行します。

    • shfusion.dllは、GACフォルダーを明確に見せるエクスプローラー拡張DLLです。このファイルの登録を解除すると、アセンブリキャッシュビューアーが削除され、GACフォルダーはエクスプローラーの通常のフォルダーとして表示されます。
  2. 「%windir%\ assembly \ GAC_MSIL」を開きます。

  3. DLLフォルダーを参照して、DLLを見つけます。

  4. DLLをハードディスクのどこかにコピーし、プロジェクトのそこから参照します

  5. "regsvr32%windir%\ Microsoft.NET \ Framework \ <。NET version directory> \ shfusion.dll"を実行して、shfusion.dllファイルを再登録し、GACの元の個別のビューを取り戻します。


81
これは機能しますが、少し複雑です。コマンドプロンプトが怖くない場合は、必要なディレクトリにcdして、DLLをそのままコピーできます。
Cheeso、2009年

3
TotalCommanderをインストールし、すべての隠しファイルを表示するオプションを有効にすると、必要なすべてのアセンブリを取得できます
Patrick Peters

4
@Andrew、オプションが渡されたときにによって呼び出されるエントリポイントをshfusion.dllサポートしていないようです。このオプションを省略すると、コンポーネントを正常に再登録できます。DllInstall()regsvr32/i
フレデリックハミディ2013

9
手順1と2をスキップして、直接%windir%\ assembly \ GAC_MSILに移動して、そこから参照できます。
Christian Fredh 2013

5
@ChristianFredh注:私にとって、これは[実行]ダイアログからのみ直接実行できます。
xr280xr 2013年

108

ここで説明する方法は非常に簡単です。

http://andreasglaser.net/post/2008/08/05/Extract-assembly-from-Global-Assembly-Cache-(GAC)-with-network-drive-mapping.aspx

記事の要約:

  • ネットワークドライブの割り当て(エクスプローラー->ツール)
    • \ servername \ folder(\\YourServer\C$\Windows\Assembly)にマップ
  • 管理者であれば共有する必要はありません
  • ドライブを参照して、アセンブリを抽出します

84

コマンドプロンプトを開き、次のように入力します。

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

これにより、GAC全体のダンプが得られます

楽しい!


10
Deepakの答えはより明確で、適切なフラグを付けてxcopyを使用しました。
katbyte 2013年

ステップバイステップのアプローチで問題にぶつかった後、すべてを取得するのに5秒かかったので、この答えを1と評価します。
FBryant87 2017年

24

はい。

DisableCacheViewerレジストリキーを追加する

HKLM \ Software \ Microsoft \ Fusion \の下にDisableCacheViewerという名前で新しいdwordキーを作成し、[DWORD]値を1に設定します。

Windowsエクスプローラーに戻り、アセンブリフォルダーに移動すると、通常のファイルシステムビューになります。


2
過小評価の答え。ありがとう!
xr280xr 2013年

1
これが本当の解決策です。元に戻すのは簡単で、コマンドラインは必要ありません。
user2920518 2017

16

Davidが言及しているように、コマンドラインから実行するのが最も簡単な方法だと思います。唯一のトリックは、.dllが単にC:\ Windows \ Assemblyに配置されていないことです。C:\ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]に移動する必要があります。次に、以下を使用してコピーを実行できます。

[ASSEMBLY_NAME] .dll c:\(または任意の場所)をコピーします

お役に立てば幸いです。


13

私が見つけた簡単な方法は、コマンドプロンプトを開いて、目的のDLLが見つかるまで言及したフォルダーを参照することです。その後、copyコマンドを使用して、それを取得できます。Windowsエクスプローラには、このフォルダの「役立つ」特別なビューがあります。


今朝、興味深い問題を見つけました。私はGACでDLLを更新し、cmd行メソッドを使用してバックアップを作成しました。新しいDLL(同じバージョン番号)をアップロードしようとすると、cmdウィンドウをシャットダウンしたときにのみエラーが発生しました。何が悪いのかを知るために私に数分の呪いをかけました!
NeilD 2010

11

オープンRUNは、その後入力し%windir%\assembly\GAC_MSIL、これはフォルダの名前と、それを開いて、あなたのDLLへ移動することができ、その後のフォルダー]ビューで、あなたのDLLを開きます、あなたのdllファイルを検索し、簡単にそれをコピーします。


非常に簡単な解決策。ありがとうございました。
Dblock247 2018

4

私はPowerShell GACの作成者です。PowerShell GACを使用すると、フォルダー構造の変更などのGAC内部に依存することなく、GACからアセンブリを抽出できます。

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany

3

このMSDNブログの投稿では、GACからDLLを抽出する3つの方法について説明しています。これまでの方法の有用な要約。


3

代わりに、ファイルブラウザ「Total Commander」を使用してください。

  1. Total Commanderで「非表示/システムファイルを表示する」設定を有効にする
  2. 「c:\ windows \ assembly」に移動します
  3. 写す

3

レジストリを変更したり、コマンドライン、PowerShell、その他のプログラムを使用したりせずにGACの内部を確認する方法を見つけたと思います。

(どこへでも)新しいショートカットを作成します。次に、ターゲットが次のようになるようにショートカットを変更します。

%windir%\assembly\GAC_MSIL\System

このショートカットを開くと、GAC(誰もが持っているはず)内のSystemフォルダーに移動し、上位のディレクトリに切り替えて、必要な他のフォルダーを参照できる(そしてdllファイルを表示できるなど)という素晴らしい副作用があります。

これをWindows 7およびWindows Server 2012でテストしました。

注:ショートカットの作成時にそのターゲットを使用することはできませんが、編集することはできます。

楽しい!


2

C:\ Windowsに移動して[アセンブリ]フォルダーを右クリックし、アーカイブに追加を選択します

ちょっと待って

volaあなたはあなたのGACのすべてのアセンブリを含むアーカイブファイルを持っています


2

Powershellスクリプトから、これを試すことができます。GACにはアセンブリのバージョンが1つしかなかったので、これは問題なく機能しました。

cd "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\"
Get-ChildItem assemblypath -Recurse -Include *.dll |  Copy-Item -Destination "c:\folder to copy to"

アセンブリパスにはワイルドカードを使用できます。


0

もう1つの方向-MSIファイルを解凍して、その方法で特典を取得するだけです。最終的なアンインストールからあなたを救います。。。


0

コマンドラインからのコピーは不要です。スタートウィンドウの検索でDLLの名前を入力しました。[もっと見る]を選択しました。GACの1つが検索ウィンドウに返されました。私はそれを右クリックして、ファイルの場所を開くと言いました。通常のWindowsエクスプローラで開きました。ファイルをコピーしました。私は窓を閉めた。できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.