我正在关注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事件,或者可能会看到我不正确地关注文章的位置?
答案 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)。傻我。