Как проверить, зарегистрирован ли 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, тогда класс не зарегистрирован