اصطياد أحداث SENS في .NET ، لا توجد سمات GUID
سؤال
انا اتبع هذه المقالة لتسجيل أحداث Sens عبر COM ، لكنني أعتقد أنني أفتقد شيئًا. أنا أدعو طريقة المشتركين التي تقول المقالة للكتابة ، مثل هذا:
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 ، عندما كان ينبغي أن أعمل نوعًا (isenslogon) (Isenslogon لديه بالفعل guidattribute عليه). ما أغباني.
نصائح أخرى
أعتقد أن رمزك غير آمن ، لأنك تفترض الدعوة إلى 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 ، انظر إلى معرف Typelib ... إذا لم يكن هناك ، فقم بإصدار هذا regsvr32 ess.dll
حيث يوجد ملف DLL في المجلد الحالي.
أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.