Перехват событий 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 находится в текущей папке.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Другие вопросы по тегам