在.NET中捕获SENS事件,没有Guid属性

时间:2010-02-15 23:05:45

标签: c# .net events com sens

我正在关注this article通过COM注册SENS事件,但我想我错过了一些东西。我正在调用文章所写的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 个答案:

答案 0 :(得分:1)

我认为你的代码是不安全的,因为你假设调用type.GetCustomAttributes(...)没有检查....我会把它包装在try / catch块中看看发生了什么......并检查异常...

private static String GetInterfaceGuid(Type type) 
{ 
    string sGuid = string.Empty;
    try{
        Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true); 
        if (attributes != null && attributes.Length >= 1){
           sGuid = String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value); 
        }else{
           // FAIL!
        }
    }catch(System.Exception up){
        throw up;
    }
    return sGuid;
} 

ess.dll完全注册了吗?您可能需要手动注册吗?检查注册表中HKEY_CLASSES_ROOT下的那些类ID,查看类型库ID ...如果它们不在那里,则发出此regsvr32 ess.dll,其中dll文件位于当前文件夹中。

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:0)

我明白了。我将typeof(SensLogon)传递给EventSystemRegistrar.SubscribeToEvents,当我应该传递typeof(ISensLogon)时(ISensLogon确实有一个GuidAttribute)。傻我。