2012-03-11 3 views
1

Я проверяю раздел реестра HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32, чтобы узнать, зарегистрирована ли управляемая .NET DLL.Проверка регистрации DLL

В Guid (иксы) Я получаю от

public static string AssemblyClassIDString(System.Reflection.Assembly assembly) 
    { 
     object[] objects = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false); 
     if (objects.Length > 0) 
     { 
      return ((System.Runtime.InteropServices.GuidAttribute)objects[0]).Value; 
     } 
     else 
     { 
      return String.Empty; 
     } 
    } 

Функция возвращает идентификатор GUID, но не один соответствие один внутри реестре под CLSID. Кто-нибудь знает, почему это не работает?

Благодаря

+0

обратитесь к: http://stackoverflow.com/questions/689072/how-to-check-if-a-dll-is-registered –

+0

@SandeepBansal да, это метод, который я использую. Мой вопрос относится к тому, почему GUID из моей функции не соответствует таковой, если CLSID. –

ответ

1

Ключ реестра CLSID связан с типами, а не с узлами. Regasm.exe использует свойство Type.GUID, чтобы определить, какой ключ для записи. Другими словами, вам придется перебирать assembly.GetTypes(). Сначала проверьте атрибут [ComVisible], затем проверьте guid. Помните, что регистрация может быть настроена с помощью атрибута [ComRegisterFunction], поэтому такой код не является slamdunk.

Руководство по монтажу на самом деле используется, оно генерирует директиву библиотеки, LIBID. Регистрация типов библиотек в HKCR \ Typelib довольно необычна, это необходимо только для того, чтобы ваш компонент отображался в браузерах импорта COM или если вы хотите использовать стандартный маршаллер COM для перекрестного взаимодействия между квартирами или процессами. Основная информация - available here.

Лучший способ обеспечить регистрацию COM-сервера - это просто зарегистрировать его. Выполнение этого более одного раза не является проблемой.

1

Я всегда считал, что самый надежный способ проверить, если COM DLL зарегистрирован или нет, чтобы попытаться создать тип из библиотеки.

Возможно, вы можете следовать этому и вместо проверки реестра попытаться получить ссылку на тип с Type.GetTypeFromProgID для любого известного типа из библиотеки, а затем создать экземпляр с Activator.CreateInstance.

Не имеет значения, является ли ваша DLL обычным COM или .NET, зарегистрированным как COM.

Смежные вопросы