سؤال

انا اتبع هذه المقالة لتسجيل أحداث 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 في المجلد الحالي.

أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top