Qayta ko'rib chiqish va raqamlarni yaratishni e'tiborsiz qoldirish uchun Assembly Binding Redirection-dan qanday foydalanish kerak

Menda C# da bir nechta .NET ilovalari va ular uchun ma'lumotlar bazasiga kirish uchun API mavjud. Men API ning barcha versiyalarini ma'lumotlar bazasiga joylashtirmoqchiman va ulardan eng yuqori reviziya va qurilish raqamini tanlamoqchiman, lekin ular qurilgan asosiy va kichik raqamlarga yopishib olishlarini xohlayman. Asosan API 1.2.3.4 ga murojaat qilganimda, havola 1.2.*.* ni oʻqishini istayman, shunda ilovalar shunchaki 1.2.3.5 ni oladi, men buni XML konfiguratsiya fayllari bilan amalga oshirishim mumkinligini koʻraman. Men bunga rioya qilishni afzal ko'raman. Qoidalarni nashr qilish kabi, lekin qo'shimcha fayllarsiz. Men bunga rozi bo'lardim. Boshqa muammo shundaki, men ko'rgan barcha echimlar bitta versiyani faqat yangi versiyaga emas, balki boshqa maxsus versiyaga yo'naltiradi.

Buni qanday qilaman?

Kimdir menga nashriyot siyosati uchun ma'lumot beruvchi manbaga ishora qila oladimi?


person Anthony D    schedule 22.09.2009    source manba


Javoblar (2)


leppi taklifi uchun rahmat AppDomain.AssemblyResolve hodisasidan foydalanish , Men shunga o'xshash muammoni hal qila oldim. Mana mening kodim qanday ko'rinadi:

    public void LoadStuff(string assemblyFile)
    {
        AppDomain.CurrentDomain.AssemblyResolve += 
            new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        var assembly = Assembly.LoadFrom(assemblyFile);

        // Now load a bunch of types from the assembly...
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var name = new AssemblyName(args.Name);
        if (name.Name == "FooLibrary")
        {
            return typeof(FooClass).Assembly;
        }
        return null;
    }

Bu versiya raqamini butunlay e'tiborsiz qoldiradi va allaqachon yuklangan kutubxonani "FooLibrary" nomli kutubxona ma'lumotnomasi bilan almashtiradi. Agar siz cheklovchiroq bo'lishni istasangiz, AssemblyName sinfining boshqa atributlaridan foydalanishingiz mumkin. FooClass FooLibrary assambleyasida istalgan sinf bo'lishi mumkin.

person Don Kirkby    schedule 26.02.2010
comment
Men buni ASP.NET ilovasi kontekstida qilishga harakat qilaman. AppDomain.CurrentDomain.AssemblyResolve hodisasiga qayerdan ulanishim mumkin? Ilova hodisasi darajasida (ya'ni global.asax)? - person Mitch A; 24.02.2011
comment
O'ylaymanki, siz istalgan joydan AssemblyResolve tadbiriga ro'yxatdan o'tishingiz kerak. LoadStuff() usulida alohida narsa yo'q. Agar siz yig'ilishni har safar yuklaganingizda tadbirga ro'yxatdan o'tishga qaror qilsangiz, tugatgandan so'ng ro'yxatdan o'tishni unutmang. - person Don Kirkby; 24.02.2011

AppDomain.AssemblyResolve voqea yordam berishi kerak.

person leppie    schedule 25.09.2009