غريب السلوك عند خلط التحميل من الجمعيات باستخدام الجمعية.LoadFrom و الجمعية.تحميل

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

  •  03-07-2019
  •  | 
  •  

سؤال

غريب السلوك عند خلط التحميل من الجمعيات باستخدام الجمعية.LoadFrom و الجمعية.تحميل

لقد واجهت غريب السلوك عند تحميل التجميعات مع الجمعية.LoadFrom في وقت لاحق مع الجمعية.تحميل.
أنا تحميل التجميع باستخدام الجمعية.LoadFrom ، حيث الجمعية يقع في مجلد وهو عدم تنفيذ مجلد.

في وقت لاحق في اختبار التعليمات البرمجية عند محاولة الحمل مرة أخرى هذه الجمعية مع الجمعية.تحميل تحميل فشل مع النظام.IO.FileNotFoundException ("تعذر تحميل الملف أو التجميع...") على الرغم من أن الجمعية تم تحميلها بالفعل.تحميل فشل مع كل القوي اسم غير اسم قوي (السبب الأصلي التحميل مرة أخرى هذه الجمعية هو استخدام BinaryFormatter).

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

بسيطة نموذج التعليمات البرمجية الذي يجسد هذه المشكلة –

الجمعية assembly1 = الجمعية.LoadFrom(@"C:\a.dll");

// التحميل مع قوي-اسم يفشل الجمعية assembly2 = الجمعية.تحميل(@"a, Version=1.0.0.0, الثقافة=محايدة الأمر PublicKeyToken=14986c3f172d1c2c");

// أيضا التحميل مع غير قوية فشل الجمعية 3 = الجمعية.تحميل(@"a");

  1. أي تفسير لماذا CLR يتجاهل تحميلها بالفعل ؟
  2. أي فكرة كيف يمكن التخفيف من حدة هذه المشكلة ؟

شكرا

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

المحلول

هذا ليس غريبا.حسب الوثائق التحميل مع الحمل و LoadFrom سيتم وضع الجمعيات في سياقات مختلفة. هذا قد تساعد.

  1. أي تفسير لماذا CLR يتجاهل تحميلها بالفعل ؟

لأنهم في سياق مختلف.

  1. أي فكرة كيف يمكن التخفيف من حدة هذه المشكلة ؟

التحميل من نفس السياق ، أو مساعدة CLR العثور على الجمعية ، ربما عن طريق إرفاق معالج AppDomain.AssemblyResolve.

البديل

إذا كان الموقع الذي يتم التحميل الجمعيات من هو مجلد فرعي تحت AppDomain.BaseDirectory يمكنك ببساطة إضافة إدخال إلى التطبيق الخاص بك.التكوين:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

نصائح أخرى

@كينت Boogart:ويبدو أن التفسير الصحيح.للحصول على شرح كامل سوزان كوك هذا بلوق وظيفة التي تفصل أكثر قليلا من واحد الأصلي الذي نشر:http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

التالي هو كود الاستفادة AppDomain.AssemblyResolve -

 // register to listen to all assembly resolving attempts:
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);


 // Check whether the desired assembly is already loaded
 private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    foreach (Assembly assembly in assemblies) {
       AssemblyName assemblyName = assembly.GetName();
       string desiredAssmebly = args.Name;
       if (assemblyName.FullName == desiredAssmebly) {
           return assembly;
       }
    }

    // Failed to find the desired assembly
    return null;
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top