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

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Итак, вы можете попробовать загрузить его с помощью Assembly.Load(string), если вы получили FileNotFoundException - сборка не была зарегистрирована в GAC.

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

Ответ 3

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

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

Где "gEncrypt.clsEncrypt" - это ComName.ClassName.

Ответ 4

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;
}

Ответ 5

Если вы знаете 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;
    }
}

Ответ 6

[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);    
}

Ответ 7

  • Объявить указатель на интерфейс
  • Вызов CoCreateInstance на CLSID и IID
  • Если возвращаемое значение не является S_OK, тогда класс не зарегистрирован