web-dev-qa-db-ja.com

GACにインストールされているDLLのパス

GACに登録されているDLL(ある可能性がある)の(物理)インストール済みパスを取得するにはどうすればよいですか?これはDLLはホストされている可能性があるコントロールです.Netアプリ以外のもの(VS以外のIDEを含む...)。

System.Reflection.Assembly.GetExecutingAssembly()。Locationを使用すると、winnt\system32内のGACフォルダーのパスが表示されます。またはVSのデザインモードでVS IDEへのパスが表示されます。

物理dllが実際にインストールされているパス、またはVSのbin/debugまたは(リリース)フォルダーを取得する必要があります。

理由は、このフォルダーに取得する必要があるXMLファイルがあり、構成設定がデザインモードと実行時の両方で使用されているためです。

または、このシナリオをどのように処理するのが最善ですか?現在、デザインモードに使用している疑わしいネットワークの場所があります...(ApplicationDataフォルダーがそれをカットするとは思わないでください(ただし、ClickOnce経由でインストールされている。フォルダ))

24
kpollock

GACに何かが置かれると、実際には次のように、%WINDIR%\ Assemblyの下のスポットにコピーされます。

_C:\WINDOWS\Assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll
_

GACにインストールされている問題のアセンブリの場所を確認すると、そのようなものが表示されていると思います。それは実際に正しいです。 (.NET 1.1では、GACアセンブリのプロパティを表示したときに「コードベース」がリストされていましたが、これはgacutilを実行したときに元のファイルがどこにあったかを示すためだけでした-実際には何がロードされるかを示していませんでした。 ) 詳細はこちら を読むことができます。

一言で言えば、やりたいことができないかもしれません。ロードされているアセンブリ(Assembly.GetExecutingAssembly())に関連して検索する代わりに、プライマリアプリケーションアセンブリ(Assembly.GetEntryAssembly())を基準にして動作を切り替えるか、ファイルを設定されている環境変数に基づいている可能性がある、よく知られた場所。

23
Travis Illig

アセンブリがグローバルアセンブリキャッシュにシャドウコピーされた後、ソースアセンブリの場所をトレースバックするメタデータはないと思います。

GACにデプロイすることで何を達成しようとしていますか?解決のためのCLRのためだけの場合は、問題を解決する別の方法があります。

DLLをインストールせず、レジストリに次のキーを追加してください(このレジストリの場所は、アセンブリを解決しようとするときにCLRによって検索されます)。

_32 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo

64 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo
_

Fooキー(fooの代わりにお気に入りの名前を使用)の場合、「デフォルト」のキー名が表示されます。それをダブルクリックして、アセンブリが存在する場所に値を設定します。 (絶対パスが推奨されます)

これで、Visual Studioから、クライアントは[参照の追加]ダイアログでアセンブリを確認して使用できるようになります。

今あなたの実際の問題に来て、

Assembly.GetExecutingAssembly()は、挿入されたDLLが存在する場所のパスを返します。そこからXMLファイルを見つけます。 :)

注:レジストリキーの4.0.30319は、アプリケーションが対象としている.NET Frameworkのバージョンです。代わりに、アプリケーションが対象とするバージョンを使用してください。

3
Soundararajan

このDLLにリソースを埋め込むオプションはありますか?そうすれば、DLLがディスク上のどこにあるかは重要ではありません。XMLファイルが後に続くためです。その後、次のようなことができます。

Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml");
XmlDocument d = new XmlDocument();
using (StreamReader r = new StreamReader(s))
{
    d.LoadXml(r.ReadToEnd());
}
3
BFree

GACed DLLがファイルシステムに保存されている物理的な場所を探している場合は、次のことを試してください。start-> run-> c:\ windows\Assembly\gacここにDLL関連フォルダが見つかりません。WindowsExplorerで「Up」フォルダを実行して、c:\ windows\Assembly内のすべてをフォルダ構造として表示できます。次に、 DLL GAC_MSILまたはその他のフォルダの下に...

乾杯、スリ

2
Sri