Подтвердить что ты не робот

Путь DLL, установленной в GAC

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

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

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

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

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

4b9b3361

Ответ 1

Если что-то попадает в 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()), или поместить файл в известное местоположение, возможно основанное на переменную среды, которая будет установлена.

Ответ 2

Есть ли у вас возможность встраивания ресурса в эту 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

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

Чего вы пытаетесь достичь, развернув в GAC? Если это только ради CLR для решения задач, то есть альтернативный способ, который решает вашу проблему.

Не устанавливайте dll gll, скорее добавьте следующий ключ в реестр (это место реестра проверяется 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() вернет путь к тому месту, где присутствует insatlled dll. Найдите там XML файл.:)

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

Ответ 4

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

Cheers, Шри