Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка наличия библиотеки в GAC 
V
    Опции темы
Hmm3
Дата 25.9.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.1.2007

Репутация: нет
Всего: нет



Создаю библиотеку. Создаю ей ключ (sn), далее добавляю ее с GAC c помощью gacutil.

К проекту добавляю библиотеку через Add Reference\Browse. 

Вопрос: как проверить существует ли еще библиотека при запуске программы (проекта)? И в случае отсутствия выдавать ошибку.
PM MAIL   Вверх
source777
Дата 25.9.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Ну так если CLR не найдёт твою dll, то кинет FileNotFoundException... его и лови.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Rockie
Дата 26.9.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Hmm3, GAC - это C:\Windows\assembly. Правда по сути это не простая папка; если ее просмотреть, например, под FAR-ом, в ней будет совсем не то что видно в windows explorer-е. В любом случае - думаю если будете искать рекурсивно свою dll-ину в папке и подпапках C:\Windows\assembly, решите проблему.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Rockie
Дата 26.9.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Немного покопался, так как самому стало интересно. Добавлю еще вот это:
Цитата

Чтобы общая сборка автоматически включалась в GAC в процессе установки, проще всего воспользоваться программой установки с поддержкой GAC — например, последней версией пакета Microsoft Installer (MSI). Описание этой программы выходит за рамки книги, но мы укажем, что эту программу можно бесплатно загрузить с сайта MSDN (http://msdn.microsoft.com).
ссылка


Это сообщение отредактировал(а) Rockie - 26.9.2008, 16:48


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Hmm3
Дата 1.10.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.1.2007

Репутация: нет
Всего: нет



Цитата(Rockie @ 26.9.2008,  16:30)
GAC - это C:\Windows\assembly. Правда по сути это не простая папка; если ее просмотреть, например, под FAR-ом, в ней будет совсем не то что видно в windows explorer-е. В любом случае - думаю если будете искать рекурсивно свою dll-ину в папке и подпапках C:\Windows\assembly, решите проблему.

Угу.У меня в папке "assembly" 6 папок:
  • GAC
  • GAC_32
  • GAC_MSIL
  • NativeImages_v2.0.50727_32
  • temp
  • tmp
Библиотека записывается в GAC_MSIL. Далее путь строится так

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' ом не ловится



PM MAIL   Вверх
Rockie
Дата 1.10.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Цитата(Hmm3 @  1.10.2008,  15:31 Найти цитируемый пост)
Библиотека записывается в GAC_MSIL. Далее путь строится такassembly\GAC_MSIL\[имя]\[версия]__[ключ(?)]\[имя].dll Так, для моей библиотеки полный путь таковc:\WINDOWS\assembly\GAC_MSIL\TestLibrary\1.0.0.0__f45871145e1b89fd\TestLibrary.dllЗная имя, версию и ключ(?) можно генерировать имя и проверять файл на наличие.

Hmm3, проще smile
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ViewGAC
{
    class Program
    {
        static void Main(string[] args)
        {
            string myPath = @"C:\WINDOWS\assembly";

            DirectoryInfo dirArray = new DirectoryInfo(@myPath);

            FileInfo[] filesArray = dirArray.GetFiles("*.dll", SearchOption.AllDirectories);

            foreach (FileInfo f in filesArray)
            {
                System.Console.WriteLine(f.Name);
            }

        }
    }
}




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
XenoCode
Дата 1.10.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.4.2008

Репутация: нет
Всего: нет



Можно через API сделать.
Вот например так.
PM MAIL   Вверх
Hmm3
Дата 1.10.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.1.2007

Репутация: нет
Всего: нет



Цитата(Rockie @ 1.10.2008,  15:44)
Hmm3, проще smile
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ViewGAC
{
    class Program
    {
        static void Main(string[] args)
        {
            string myPath = @"C:\WINDOWS\assembly";

            DirectoryInfo dirArray = new DirectoryInfo(@myPath);

            FileInfo[] filesArray = dirArray.GetFiles("*.dll", SearchOption.AllDirectories);

            foreach (FileInfo f in filesArray)
            {
                System.Console.WriteLine(f.Name);
            }

        }
    }
}




Только в том случае если библиотека единственная и неповторимая. А их может быть несколько. (Это же представляется как один из плюсов GAC'a).
PM MAIL   Вверх
Rockie
Дата 1.10.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Цитата(Hmm3 @  1.10.2008,  16:27 Найти цитируемый пост)
Только в том случае если библиотека единственная и неповторимая.

Уверены? У вас есть в GAC-е дублирующаяся dll-ka "Microsoft.Interop.Security.AzRoles.dll"?
Введите
Код

FileInfo[] filesArray = dirArray.GetFiles("*AZroles*.dll", SearchOption.AllDirectories);

и в цикле
Код

System.Console.WriteLine(f.FullName);

Что у вас выводится?


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Hmm3
Дата 1.10.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.1.2007

Репутация: нет
Всего: нет



Цитата(XenoCode @ 1.10.2008,  16:18)
Можно через API сделать.
Вот например так.


Спасибо. Вот и третий способ

Цитата(Rockie @ 1.10.2008,  18:06)
Цитата(Hmm3 @  1.10.2008,  16:27 Найти цитируемый пост)
Только в том случае если библиотека единственная и неповторимая.

Уверены? У вас есть в GAC-е дублирующаяся dll-ka "Microsoft.Interop.Security.AzRoles.dll"?
Введите
Код

FileInfo[] filesArray = dirArray.GetFiles("*AZroles*.dll", SearchOption.AllDirectories);

и в цикле
Код

System.Console.WriteLine(f.FullName);

Что у вас выводится?

 Хм. У меня ничего. Пусто. filesArray пустой. 
PM MAIL   Вверх
Rockie
Дата 2.10.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Hmm3, на месте AzRoles.dll может быть любой другой файл - это пример dll-ки, несколько экземпляров которой лежит в GAC:
Цитата
C:\Windows\assembly\GAC\Microsoft.Interop.Security.AzRoles\1.2.0.0__31bf3856ad364e35\Microsoft.Interop.Security.AzRoles.dll
C:\Windows\assembly\GAC\Microsoft.Interop.Security.AzRoles\1.0.0.0__31bf3856ad364e35\Microsoft.Interop.Security.AzRoles.dll



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Hmm3
Дата 14.10.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.1.2007

Репутация: нет
Всего: нет



Цитата(Rockie @ 2.10.2008,  10:37)
Hmm3, на месте AzRoles.dll может быть любой другой файл - это пример dll-ки, несколько экземпляров которой лежит в GAC:
Цитата
C:\Windows\assembly\GAC\Microsoft.Interop.Security.AzRoles\1.2.0.0__31bf3856ad364e35\Microsoft.Interop.Security.AzRoles.dll
C:\Windows\assembly\GAC\Microsoft.Interop.Security.AzRoles\1.0.0.0__31bf3856ad364e35\Microsoft.Interop.Security.AzRoles.dll

Я не спорю, но так заодно можно проверить версию библиотеку. (Если это, конечно необходимо).
Если нет, то больше подходит такой способ. Будем считать его четвертым.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.