كيف يعمل .NET / COM مع إصدارات متعددة مسجلة عبر Regasm؟

StackOverflow https://stackoverflow.com/questions/1718641

  •  19-09-2019
  •  | 
  •  

سؤال

لدي .NET DLL (يحدث أن تكون مكتوبة في C ++ / CLI). أجزاء منه أريد أن تعرض عبر كوم. أفعل ذلك وتسجيله باستخدام "Regasm my.dll / codebase". حتى الان جيدة جدا. ولكن بعد ذلك، أغير بعض الأشياء وعدد إصدار تغييرات التجميع بالإضافة إلى نقل DLL إلى مجلد مختلف. قمت بتسجيله مرة أخرى وإلقاء نظرة على كائن COM الخاص بي في OLE / COM Viewer. أرى شيئا مثل هذا

inprocserver32 [codebase] = ملف: // c: //foo/bar/my.dll 7.0.0.0 [فئة] = my.blah.class 7.0.0.0 [التجميع] = المزامنة، الإصدار = 7.0.0.0، الثقافة = محايد ، publickeytoken = 1dd19234234 7.0.0.0 [runtimeversion] = v2.0.50727 7.0.0.0 [codebase] = ملف: / c: /dooby/do/my.dll 7.0.0.27397 [فئة] = my.blah.class 7.0.0.27397 [التجميع] = المزامنة، الإصدار = 7.0.0.27397، الثقافة = محايد، publickeytoken = 1DD19234234 7.0.0.27397 [runtimeversion] = v2.0.50727 7.0.0.27397 [codebase] = ملف: / c: // foo / bar / par / my. دلل

أسئلة حول إصدارات متعددة:

  1. لذلك أعتقد أن آخر كائن COM الذي تم تسجيله WINS. لا يهم إذا كان لدي كائن Old 7.0.0.0.0 COM مسجل، فإن 7.0.0.27397 هو الذي سيتم إنشاؤه عند إنشاء مثيل كائن COM الخاص بي لأنني مسجل أخيرا. هل هذا صحيح؟

  2. عفوا، لم أحافظ على كائن 7.0.0.0. هل هناك أي طريقة للتخلص من ذلك؟ هل هناك أي طريقة لإزالة جميع إصدارات كائن COM بخلاف الذهاب إلى التسجيل وضربها باليد؟

  3. فقط بدافع الفضول، إذا أردت تحديدا تحديد إصدار معين من كائن COM الخاص بي، هل هناك أي طريقة للقيام بذلك؟ (أنا أستخدم C ++ إذا كنت ترغب في إعطاء مثال رمز).

  4. هل هناك أي طريقة يمكنني فقط إخبار Regasm بعدم تخزين رقم الإصدار لأنه يبدو أنه يضفي الأمور وأستطيع أن أرى ما هي الفائدة. إذا مر كائن COM الخاص بي من خلال تغيير API الهامة، فسأغير GUID و ProgID، أليس كذلك؟ ماذا لو كنت لا أريد تسجيل إصدارات متعددة (لا).

هل كانت مفيدة؟

المحلول

أقوم دائما بتعيين تجميعات COM المرئية مع مجموعة ثابتة لهذا السبب فقط. إذا كنت ترغب في الحصول على ثنائيات الموسومة مع إصدار، استخدم CasselationFileversion بدلا من ذلك.

  1. آخر كائن مسجل يفوز: نعم
  2. ليس صحيحا. يمكنك وضع أشياء في ComeRegistrFunctionfundfundfundfundfundfundfundfundfundfundfundfundfundfundfundfundfumber إلى أتمتة التنظيف، ولكن إذا تركت Droppings الإصدار القديم حولها، فهذه هي الطريقة الوحيدة.
  3. كنت تفعل ذلك مع Guid Coclass مختلفة و / أو ProgID (على سبيل المثال، mycoclass.1، .2، إلخ). لا يعرف cocreateInstance أي شيء عن قيم الإصدار - يتم استخدامها من قبل المنشط CLR للتأكد من تحميل التجميع المناسب.
  4. لا يوجد شيء يجب القيام به هو عدم تغيير إصدار التجميع الخاص بك أبدا (انظر أعلاه).

نصائح أخرى

يجب توافق المكونات التي تحتوي على نفس CLSID، خاصة إذا قمت بتغيير رقم الإنشاء فقط بين التجميعات. هنا هو الوحيد ذو صلة الشيء الذي وجدته لتأكيد هذا عن طريق googling بسرعة.

للإجابة على أسئلتك مباشرة:

  1. صيح.
  2. Regasm / إلغاء تسجيل
  3. تفحص إعادة توجيهات ملزمة.
  4. على الاغلب لا.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top