27

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

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

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

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

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

4

4 に答える 4

24

何かが 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()たり ( )、既知の場所にファイルを配置したりすることができます。設定。

于 2008-12-19T21:53:01.857 に答える
3

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

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

dll を gac インストールせず、次のキーをレジストリに追加します (このレジストリの場所は、アセンブリを解決しようとするときに 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 のバージョンです。代わりに、アプリケーションが対象とするバージョンを使用してください。

于 2011-12-06T17:46:03.233 に答える
3

この 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());
}
于 2008-12-18T12:45:38.190 に答える