ما هي أفضل طريقة لإلغاء تمييز الأعياد المكتوبة بنسخة مختلفة من مجموعة موقعة؟

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

سؤال

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

هذا ما وجدته أعمالًا.

internal class WeaklyNamedAppDomainAssemblyBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        ResolveEventHandler handler = new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        AppDomain.CurrentDomain.AssemblyResolve += handler;

        Type returnedType;
        try
        {
            AssemblyName asmName = new AssemblyName(assemblyName);
            var assembly = Assembly.Load(asmName);
            returnedType = assembly.GetType(typeName);
        }
        catch
        {
            returnedType = null;
        }
        finally
        {
            AppDomain.CurrentDomain.AssemblyResolve -= handler;
        }

        return returnedType;
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string truncatedAssemblyName = args.Name.Split(',')[0];
        Assembly assembly = Assembly.Load(truncatedAssemblyName);
        return assembly;
    }
}

ومع ذلك ، فإن التسبب في تغيير عملية الربط على مستوى العالم يبدو خطيرًا بالنسبة لي. يمكن أن تحدث أشياء غريبة إذا كان التسلسل يحدث في خيوط متعددة. ربما يكون الحل الأفضل هو القيام ببعض معالجة اسم typename؟

تعديل: الطريقة القائمة على السلسلة لا تعمل. يبدو أن الأدوية الجيرية تحتاج إلى نوع كامل مسمى. شنيعة جدا إذا سألتني.

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

المحلول

يتم إطلاق حدث AssemblyResolve فقط إذا فشل الربط العادي. لذلك ، سيكون أي شيء يمكن حله من خلال الطرق العادية. من المحتمل فقط أن تطلق عمليات إزالة التسلسل الحدث ، ولديك استراتيجية صالحة تمامًا لمحاولة حلها.

سأضيف معالج الأحداث AssemblyResolve عندما يبدأ البرنامج واتركه هناك ، بدلاً من إضافته وإزالته. هذا يزيل مصدرا محتملا لقضايا متعددة الخيوط.

نصائح أخرى

بدلاً من تسلسل المجموعة بأكملها ، هل يمكنك التكرار من خلالها وتسلسل كل عنصر بشكل فردي؟ ثم يمكنك استخدام نهج SerililyBinder.

وهذا ينبغي أن أجيب على سؤالك: SerializationBinder مع قائمةu003CT>

عند استخدام أنواع عامة في SerializationBinder.bindtotype ، تحتاج إلى استخدام أسماء من النوع الضعيف بدلاً من أسماء الأنواع المؤهلة تمامًا.

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