Как проверить, зарегистрирован ли DLL-файл?

Как узнать, зарегистрирован ли файл DLL, записанный на C #, или нет программно?

Я уже пробовал этот код, но он не оторвался.

Если я зарегистрирую DLL-файл и проверю его с помощью этого кода, он вернется. Если я отменил регистрацию и запустил этот же код, он снова вернется. Я передаю полный путь к файлу DLL в качестве аргумента.

Мы разработали простой DLL-файл в Visual C ++ . После этого мы зарегистрировали его. Теперь мы хотим подтвердить, что он зарегистрирован.

Боб, ты сам заменишь кусок кода, мне все же сложно?

Если я зарегистрирую DLL-файл, есть ли запись в реестре? Должен ли я найти эти записи и судить о том, что DLL-файл зарегистрирован или нет?

Последний ответ работает с некоторыми изменениями. Я посмотрел в typelib вместо clsid.

earwicker der: Во всяком случае, я сделал это с небольшой модификацией. Теперь работает.

Вам нужно узнать GUID объекта COM, определенного в DLL. Затем просмотрите этот раздел реестра:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32 

Замените x на GUID.

Он должен иметь значение по умолчанию, которое содержит полный путь к DLL.

Если вы имеете в виду зарегистрированный в GAC, вот мое соображение: чтобы зарегистрироваться в GAC, assembly должна быть подписана с сильным именем (иметь токен открытого ключа на своем имени).

Поэтому вы можете попробовать загрузить его с помощью Assembly.Load(string) , если у вас есть FileNotFoundException – assembly не была зарегистрирована в GAC.

Если не Assembly.GetName().GetPublicKeyToken() ошибка, но результат Assembly.GetName().GetPublicKeyToken() пуст или пуст – это означает, что вы нашли сборку в каталоге приложения, а не в GAC.

Вы можете использовать это:

 My.Computer.Registry.ClassesRoot.GetSubKeyNames.Contains("gEncrypt.clsEncrypt") 

Где «gEncrypt.clsEncrypt» – имя ComName.ClassName.

 class TestDll { //Import your tested DLL here [DllImport("kernel32")] public extern static int LoadLibrary(string lpLibFileName); } try { TestDll test = new TestDll(); } catch(DllNotFoundException ex) { return false; } 

Если вы знаете CLSID библиотеки dll COM, вы можете просто проверить, есть ли ключ с этим CLSID в HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component} или HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node => 32-битный COM, зарегистрированный на 64-битной машине)

Вот пример:

 private bool IsAlreadyRegistered() { using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey( Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default)) { const string clsid = "{12345678-9012-3456-7890-123456789012}"; var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ?? classesRootKey.OpenSubKey(@"CLSID\" + clsid); if (clsIdKey != null) { clsIdKey.Dispose(); return true; } return false; } } 
 [DllImport("kernel32")] public extern static bool FreeLibrary(int hLibModule); [DllImport("kernel32")] public extern static int LoadLibrary(string lpLibFileName); public bool IsDllRegistered(string DllName) { int libId = LoadLibrary(DllName); if (libId>0) FreeLibrary(libId); return (libId>0); } 
  1. Объявить указатель на интерфейс
  2. Вызовите CoCreateInstance на CLSID и IID
  3. Если возвращаемое значение не является S_OK, тогда class не зарегистрирован
  • Как преобразовать аргумент командной строки в int?
  • C # общий список как получить тип T?
  • BigInteger - Hex / Decimal / Octal / Binary string?
  • Использование 'const' для параметров функции
  • C # Преобразование строки из UTF-8 в ISO-8859-1 (Latin1) H
  • Могу ли я принуждать кеш к многоядерному процессору x86?
  • Секвенирование и реорганизация задач
  • Log4Net, как добавить настраиваемое поле в мой журнал
  • Проверить свойства всех аргументов шаблона шаблона
  • Разница между std :: system_clock и std :: stable_clock?
  • Чтение значения Datetime из листа Excel
  • Давайте будем гением компьютера.