Как проверить, что COM dll зарегистрирован или нет в C #? - PullRequest
9 голосов
/ 11 февраля 2011

Мне нужно проверить, зарегистрирован ли msdia100.dll на компьютере, на котором я работаю, чтобы зарегистрировать DLL с помощью команды regsvr32.exe.Как я могу сделать это с C #?

Ответы [ 6 ]

4 голосов
/ 05 декабря 2015

Предполагая, что вы знаете CLSID COM dll, вы можете просто проверить, есть ли ключ с этим 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;
    }
}
4 голосов
/ 11 февраля 2011

Подходы к реестру хороши и стоят того, чтобы их использовать, но чтобы быть уверенным, вы также можете рассмотреть возможность создания чего-то внутри COM-объекта, заключенного в try {} catch (COMException) {}, а затем представить что-то разумное пользователю, если COMExceptionбыл пойман.

3 голосов
/ 11 февраля 2011

Вы можете искать в реестре для этого.Предполагая, что вы не знаете COM-объекты, содержащиеся в DLL, вам придется начать поиск имени DLL сначала в HKEY_CLASSES_ROOT.

Затем используйте имя класса, чтобы найти CLSID в HKEY_CLASSES_ROOT\[ClassName]\CLSIDи, наконец, вы сможете найти его CLSID как HKEY_CLASSES_ROOT\CLSID\[CLSID].

Обратите внимание, что регистры реестра записаны из памяти, поэтому могут быть немного не в порядке.

Редактировать: Или, если вы знаете классимя, вы можете просто попытаться создать экземпляр этого и посмотреть, работает ли он или нет.

2 голосов
/ 14 февраля 2013

Проверьте, существует ли ключ, используя Microsoft.Win32.RegistryKey

var key = Microsoft.Win32.RegistryKey.OpenBaseKey(
            Microsoft.Win32.RegistryHive.ClassesRoot,
            Microsoft.Win32.RegistryView.Default)
            .OpenSubKey("Interface")
               //replace with your COM object GUID
            .OpenSubKey("{a3560000-0000-0000-c63b3-000000cbadf0000}");

        return key != null;
1 голос
/ 11 февраля 2011

Посмотрите на реестр по адресу HKEY_CLASSES_ROOT \ CLSID \\ InprocServer. Если у вас есть эта запись, то DLL должна быть зарегистрирована.

0 голосов
/ 11 февраля 2011

Это правильный способ сделать это. Это действительно связано с PInvoke, но это 'только потому, что они не предоставили эту возможность в .NET напрямую.

[DllImport("kernel32")]    
public extern static int LoadLibrary(string lpLibFileName);

[DllImport("kernel32")]    
public extern static bool FreeLibrary(int hLibModule);        

public bool IsDllRegistered(string DllName)    
{    
  int libId = LoadLibrary(DllName);
  if (libId>0) FreeLibrary(libId);
  return (libId>0);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...