سؤال

أحتاج إلى نشر إصدارات متعددة من نفس مشروع C# .NET. إخراج المشروع هو مجموعة com interop لاستخدامها في تطبيق أصلي. المشكلة التي أواجهها هي أنه يتعين علي نشر عدة إصدارات من هذه التجميع جنبًا إلى جنب ، لكن كل ما أفعله لا يبدو أنه يخلق إصدارات مختلفة. بدلاً من ذلك ، تتجاوز الإصدارات بعضها البعض.

لقد حاولت تغيير GUID Assembly ، وحاولت تغيير أرقام إصدار التجميع ، وحاولت تجديد مفتاح الاسم القوي التجميع ، وحاول تغيير عنوان التجميع والوصف. أفضل ألا أضطر إلى تغيير GUID أو أسماء الأنواع الفردية في التجميع لأغراض الإصدار.

كيف يمكنني التأكد من أن هذه الإصدارات لا تتغلب على بعضها البعض ويمكنني أن أرى ونشرها جنبًا إلى جنب؟

شكرا مقدما!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropTest
{
    [Guid("...")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Test
    {
        public Test()
        {
        }

        public string Version
        {
            get
            {
                return "1.0";
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

أفضل ألا أضطر إلى تغيير GUID أو أسماء الأنواع الفردية في التجميع لأغراض الإصدار.

لكن ذلك بالضبط ما عليك القيام به لمنع أنواع com من التدخل مع بعضها البعض. يتم استخدام [GUID] لتحديد مفتاح التسجيل في HKLM Software Classes clsid حيث يتم تسجيل فئة COM. سيؤدي نسختان متميزتان مع نفس GUID إلى كتابة مفاتيح بعضهما البعض. على خلاف ذلك المعروف باسم DLL Hell. تغيير الواجهة العامة يستوجب GUID جديد لضمان عدم تموت العملاء الذين يستخدمون الشخص القديم مع من المستحيل تشخيص سوء السلوك. متطلبات كوم صخرية.

إن حذف سمة [GUID] أمر ممكن للغاية ، فأنت الآن تترك الأمر حتى CLR لإنشاء واحدة لك. الآن تبدأ سمات التجميع في لعب دور ما ، يتم توليد قيمة GUID تلقائيًا بواسطة خوارزمية بقعة تتضمن اسم التجميع والإصدار وكذلك مجموعة الأساليب على الواجهة والوسائط الخاصة بهم. وبالتالي ضمان ذلك أي تغيير تلقائيا إنتاج GUID مختلف. وكما هو متوقع ومطلوب ، فإن [تجميع] مختلف سوف يولد [GUID].

نهج آخر ، وهو ما افترضت أنه تعنيه بـ "جنبًا إلى جنب" ، هو ليس قم بتسجيل التجميع ولكنه يعتمد على بيان بدلاً من ذلك. يجب أن تكون مضمنة في برنامج العميل ، يمكنك استخدامها <clrClass> عنصر لإعلان صفك [comvisible]. يصبح الإصدار الآن تفاصيل نشر. MSDN كيف هنا. ضع في اعتبارك أنه يجب تضمينه في عميل البرنامج ، وليس التجميع الخاص بك [comvisible]. هذا يميل إلى أن يكون مشكلة.

نصائح أخرى

جرب الربط المتأخر إلى مجموعة interop في تطبيقك الأصلي إذا استطعت. أود أن أنصح أيضًا بعدم توليد الواجهة التلقائية باستخدام التلقائي وبدلاً من ذلك توليد القراءة الخاصة بك بشكل صريح هذه لمزيد من المعلومات. يمكنك استكشاف المشكلة عن طريق فتح Regedit والبحث عن GUID و ProgID لمعرفة إصدارات التجميع التي تم تسجيلها.

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