| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Проверка наличия библиотеки в GAC |
| Автор: Hmm3 25.9.2008, 12:09 |
| Создаю библиотеку. Создаю ей ключ (sn), далее добавляю ее с GAC c помощью gacutil. К проекту добавляю библиотеку через Add Reference\Browse. Вопрос: как проверить существует ли еще библиотека при запуске программы (проекта)? И в случае отсутствия выдавать ошибку. |
| Автор: source777 25.9.2008, 22:34 |
| Ну так если CLR не найдёт твою dll, то кинет FileNotFoundException... его и лови. |
| Автор: Rockie 26.9.2008, 16:30 |
| Hmm3, GAC - это C:\Windows\assembly. Правда по сути это не простая папка; если ее просмотреть, например, под FAR-ом, в ней будет совсем не то что видно в windows explorer-е. В любом случае - думаю если будете искать рекурсивно свою dll-ину в папке и подпапках C:\Windows\assembly, решите проблему. |
| Автор: Rockie 26.9.2008, 16:47 | ||
Немного покопался, так как самому стало интересно. Добавлю еще вот это:
|
| Автор: Hmm3 1.10.2008, 15:31 | ||
Угу.У меня в папке "assembly" 6 папок:
assembly\GAC_MSIL\[имя]\[версия]__[ключ(?)]\[имя].dll Так, для моей библиотеки полный путь таков c:\WINDOWS\assembly\GAC_MSIL\TestLibrary\1.0.0.0__f45871145e1b89fd\TestLibrary.dll Зная имя, версию и ключ(?) можно генерировать имя и проверять файл на наличие. Второй путь. В реестре по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\GACChangeNotification\Default Находится куча значений. Туда добавляется и значение с именем, версией, и ключом библиотеки. Можно брать все имена значений. В цикле их перебирать -- искать имя своей библиотеки. Потом из найденного вытаскивать версию и ключ. Так для моей библиотеки двоичный параметр Имя: TestLibrary,1.0.0.0,,f45871145e1b89fd,MSIL Значение 53 E3 DB 42 B8 23 C9 01 Т.е Имя формируется по принципу [имя],[версия],,[ключ],[MSIL] Просто была надежда что есть какие-то встроенные средства для таких проверок. Тем более что GAC -- не посторонняя технология. И неизвестно что и куда будет писаться в следующих версиях Windows. P.S. Ошибка которая возникает при отсутствии библиотеки try- catch' ом не ловится |
| Автор: XenoCode 1.10.2008, 16:18 |
| Можно через API сделать. Вот например http://www.eggheadcafe.com/software/aspnet/32079348/determine-if-assembly-is.aspx. |
| Автор: Hmm3 1.10.2008, 16:27 | ||||
Только в том случае если библиотека единственная и неповторимая. А их может быть несколько. (Это же представляется как один из плюсов GAC'a). |
| Автор: Rockie 1.10.2008, 18:06 | ||||
Уверены? У вас есть в GAC-е дублирующаяся dll-ka "Microsoft.Interop.Security.AzRoles.dll"? Введите
и в цикле
Что у вас выводится? |
| Автор: Hmm3 1.10.2008, 18:23 | ||||||||
Спасибо. Вот и третий способ
Хм. У меня ничего. Пусто. filesArray пустой. |
| Автор: Rockie 2.10.2008, 10:37 | ||
Hmm3, на месте AzRoles.dll может быть любой другой файл - это пример dll-ки, несколько экземпляров которой лежит в GAC:
|
| Автор: Hmm3 14.10.2008, 16:18 | ||||
Я не спорю, но так заодно можно проверить версию библиотеку. (Если это, конечно необходимо). Если нет, то больше подходит такой способ. Будем считать его четвертым. |