(Физический) (Установленный) путь к DLL, установленной в GAC - PullRequest
23 голосов
/ 18 декабря 2008

Как я могу получить (физический) установленный путь к DLL, которая (может быть) зарегистрирована в GAC? Эта библиотека DLL является элементом управления, который может быть размещен не в приложении .Net, а в других средах (кроме ID ...).

Когда я использую System.Reflection.Assembly.GetExecutingAssembly (). Location, он дает путь к папке GAC в winnt \ system32 - или в режиме «Дизайн» в VS дает путь к ID ID VS.

Мне нужно получить путь, где фактически установлена ​​физическая DLL - или папку bin / debug или (release) для VS.

Причина в том, что в этой папке есть XML-файл, который мне нужен, с настройками конфигурации, которые используются как в режиме разработки, так и во время выполнения.

Или как лучше справиться с этим сценарием? У меня есть сомнительное сетевое местоположение, которое я сейчас использую для режима разработки ... (Не думайте, что папка ApplicationData собирается ее обрезать (но версия .Net должна быть загружена, так как она установлена ​​через ClickOnce, и можно использовать данные Clickonce). папка))

Ответы [ 4 ]

22 голосов
/ 20 декабря 2008

Если что-то помещается в GAC, оно на самом деле копируется в папку в% WINDIR% \ assembly, например

C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll

Я предполагаю, что вы видите нечто подобное, когда вы проверяете расположение рассматриваемой сборки, когда она установлена ​​в GAC. Это на самом деле правильно. (В .NET 1.1 была указана «Codebase», когда вы просматривали свойства сборки GAC, но это было только для того, чтобы показать вам, где находился исходный файл при запуске gacutil - на самом деле это не указывало, что будет загружено. Вы можете прочитать подробнее об этом здесь .

Короче говоря, вы не сможете делать то, что хотите. Вместо того, чтобы смотреть по отношению к какой-либо загружаемой сборке (Assembly.GetExecutingAssembly()), вы можете захотеть переключить поведение на основной сборку приложения (Assembly.GetEntryAssembly()) или поместить файл в какое-то известное место, возможно, на основе на переменную окружения, которая устанавливается.

3 голосов
/ 06 декабря 2011

После того, как сборка теневого копирования скопирована в кэш Global Assembly, я не думаю, что есть какие-либо метаданные для отслеживания местоположения исходных сборок.

Чего вы пытаетесь достичь, развертывая в 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), вы увидите имя ключа «Default». Дважды щелкните по нему и установите значение там, где существует ваша сборка. (предпочтителен абсолютный путь)

Теперь из Visual Studio ваш клиент должен видеть ваши сборки в диалоге «Добавить ссылку» и может использовать его.

Теперь перейдем к вашей актуальной проблеме,

Assembly.GetExecutingAssembly() вернет путь к месту, где присутствуют изолированные DLL. Найдите файл XML оттуда. :)

Примечание. В разделе реестра 4.0.30319 - это версия .NET Framework, на которую нацелено ваше приложение. Вместо этого используйте любую версию, на которую нацелено ваше приложение.

3 голосов
/ 18 декабря 2008

У вас есть возможность встроить ресурс в эту 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());
}
2 голосов
/ 06 августа 2009

Если вы ищете физическое местоположение, где ваша GACed DLL хранится в файловой системе, попробуйте это: Пуск -> Выполнить -> C: \ Windows \ Assembly \ GAC Если вы не найдете там папки, связанной с DLL, вы можете создать папку «Вверх» в проводнике Windows, чтобы отобразить все в c: \ windows \ assembly в виде структуры папок. Затем вы можете найти свою DLL в GAC_MSIL или в любой другой папке там ...

Ура, Sri

...