Перехват событий SENS в.NET, без атрибутов Guid
Я следую этой статье за регистрацией событий SENS через COM, но я думаю, что что-то упустил. Я вызываю метод SubscribeToEvents, который в статье написано:
EventSystemRegistrar.SubscribeToEvents("ManagedSENS EventSubscriber", "ManagedSENS.SensLogonInterop", subscriptionViewerID, this, typeof(SensLogon));
что приводит к вызову этого метода:
private static String GetInterfaceGuid(Type type)
{
Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true);
return String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value);
}
Проблема в том, что есть тип класса SensLogon, который они советуют писать, но у него нет атрибутов, поэтому метод генерирует исключение. Единственные атрибуты, которые, по сути, являются GuidAttributes, которые, как они говорят, пишут, относятся к этим классам, которые не имеют ничего общего с классом SensLogon (по крайней мере, насколько я могу судить):
[ComImport, Guid("4E14FBA2-2E22-11D1-9964-00C04FBBB345")]
class EventSystem { }
[ComImport, Guid("7542E960-79C7-11D1-88F9-0080C7D771BF")]
class EventSubcription { }
[ComImport, Guid("AB944620-79C6-11d1-88F9-0080C7D771BF")]
class EventPublisher { }
[ComImport, Guid("cdbec9c0-7a68-11d1-88f9-0080c7d771bf")]
class EventClass { }
Возможно, я что-то здесь упускаю? Я должен был извлечь из этих классов или что-то? Класс SensLogon показан, но у него нет ни одного из этих атрибутов.
Кто-нибудь делал что-то похожее, чтобы зарегистрироваться в COM-событиях, или, может быть, может посмотреть, где я неправильно прочитал статью?
2 ответа
Я понял. Я передавал typeof(SensLogon) в EventSystemRegistrar.SubscribeToEvents, когда я должен был передать typeof(ISensLogon) (ISensLogon действительно имеет атрибут GuidAttribute). Дурак я.
Я думаю, что ваш код небезопасен, потому что вы принимаете вызов type.GetCustomAttributes(...)
работал без проверки.... я бы завернул это в try
/catch
заблокировать, чтобы увидеть, что происходит... и проверить исключение...
закрытая статическая строка GetInterfaceGuid(тип Type) { string sGuid = string.Empty; пытаться{ Object[] attribute = type.GetCustomAttributes(typeof(GuidAttribute), true); if (attribute!= null && attribute.Length >= 1){ sGuid = String.Format("{{{0}}}", ((GuidAttribute)attribute [0]).Value); } Еще { // ПОТЕРПЕТЬ ПОРАЖЕНИЕ! } }catch(System.Exception up){ подбрасывать; } вернуть sGuid; }
Сделал ess.dll
зарегистрироваться вообще? Возможно, вам придется зарегистрировать его вручную? Проверьте реестр на наличие идентификаторов этих классов в разделе HKEY_CLASSES_ROOT, посмотрите на идентификатор typelib... если их нет, введите это regsvr32 ess.dll
где-либо файл DLL находится в текущей папке.
Надеюсь, это поможет, С наилучшими пожеланиями, Том.