Загрузка библиотек и путь их поиска...
От: Grammer  
Дата: 03.04.06 10:28
Оценка:
В продолжение темы описанной тут
Автор: Grammer
Дата: 31.03.06


Ошибка стала понятна но как с ней справиться — неясно.

Есть папка с плагинами которые пишутся как отдельно так и на основе друг друга.
Например есть два плагина:

expLib.dll
depExpLib.dll

===

которые лежат во вложенной (относительно испольняемого приложения) папке Plugins

depExpLib.dll имеет референс на expLib.dll

всяпроблема что лежат они не там же где шлавная испольняемая сборка а во вложенной папке Plugins
вообщем:

Assembly.LoadFile(Environment.CurrentDirectory + "\\Plugins\\expLib.dll");
Assembly.LoadFile(Environment.CurrentDirectory + "\\Plugins\\depExpLib.dll");


проходит нормально
а вот при потытке сделать что либо с depExpLib.dll например как в моем примере получить тип который написан на базе типа из expLib.dll то вылетает FileNotFoundException c ошибкой о том что не найдена expLib.dll, хотя я её до этого явно загрузил в домен...

я так понял что при попыте дотупа к типу из depExpLib.dll который написан на базе типа из expLib.dll среда вытается загрузить expLib.dll не проверяя его наличия в домене и ищет только с папке с исполняемым модулем не заходя в папку Plugins

как изменить жту политику поиска?

зы: солюшн воспроизводящий проблему

код:
class Program
{
   static void Main(string[] args)
   {
      Console.WriteLine("Starting app");
      Program p = new Program();
      p.Run();
      Console.WriteLine("Exiting app. Press enter to exit");
      Console.ReadLine();
   }

   public Program()
   {
   }

   public void Run()
   {
      LoadPlugins();
   }

   public void LoadPlugins()
   {
      List<Assembly> asmList = new List<Assembly>();
      asmList.Add(Assembly.LoadFile(Environment.CurrentDirectory + "\\Plugins\\depExpLib.dll"));
      asmList.Add(Assembly.LoadFile(Environment.CurrentDirectory + "\\Plugins\\expLib.dll"));
      //Environment.CurrentDirectory += "\\Plugins"; // не помогает

      foreach (Assembly asm in asmList)
      {
         try
         {
             Type[] types = asm.GetExportedTypes(); // вот тут Binding Failure Exception
             foreach (Type type in types)
             {
                 Console.WriteLine(type.ToString());
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine(ex.ToString());
         }
       }

    }
}


Exception

BindingFailure was detected
Message: The assembly with display name 'expLib' failed to load in the 'Anonymous' binding context of the AppDomain with ID 1. The cause of the failure was: System.IO.FileNotFoundException: Could not load file or assembly 'expLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Не удается найти указанный файл.
File name: 'expLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

=== Pre-bind state information ===
LOG: User = SIS_DOMAIN\Strakh_a
LOG: DisplayName = expLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/My_Project/OTHER/Копия AppDomainAsm/AppDomainAsm/bin/Release/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.


Всем спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.