Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Свои References, но в подпапке

#c_sharp #wpf


Есть решение с двумя проектами


DLL библиотека
WPF приложение, использующее DLL в References


При компилировании проекта WPF, DLL помещается в папку с EXE. Однако по независимым
от меня причинам необходимо что бы WPF приложение искало эту DLL в папке [номер версии]
в папке приложения т.е.:

Если приложение находится в папке c:\MyProject\project.exe, а у файла версия 1.0.3.24
значит DLL будет находиться в c:\MyProject\1.0.3.24\MyLibrary.dll

Вот моё решение:

Свойство Build Action у  App.xaml установил в Page, а в App.xaml.cs добавил код.

[STAThread]
public static void Main()
{
  try
  {
    //Берём Assembly приложения
    System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
    //Берём папку приложения
    string appDirectory = System.IO.Path.GetDirectoryName(assembly.Location);
    //Берём версию приложения
    string appVersion = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
    //Вычисляем папку с DLL
    string dllpatch = System.IO.Path.Combine(appDirectory, appVersion);
    //Берем переменную окружения PATH
    string environmentPATH = Environment.GetEnvironmentVariable("PATH");
    //Устанавливаем переменную окружения PATH
    Environment.SetEnvironmentVariable("PATH", environmentPATH + ";" + dllpatch,
EnvironmentVariableTarget.Process);
    //Запускаем приложение
    var application = new App();
    application.InitializeComponent();
    application.Run();
  }
  catch (Exception ex)
  {
    //Эта строка не срабатывает, Exeption не отлавливается
    System.Diagnostics.EventLog.WriteEntry("MyApplication", ex.Message + "\n" + ex.StackTrace,
System.Diagnostics.EventLogEntryType.Error);
  }
}


Однако, при запуске проекта всё нормально, но как только я помещаю dll в вышеуказанную
папку try catch не срабатывает, приложение сваливается в исключение, а лог винды выводиться:


  Приложение: project.exe Версия платформы:
  v4.0.30319 Описание. Процесс был завершен из-за необработанного
  исключения. Сведения об исключении: System.IO.FileNotFoundException
  в MyNameSpace.App.Main()

    


Ответы

Ответ 1



Попробуй воспользоваться codeBase в app.config. Еще есть . В нем можно указывать директории для поиска сборок.

Ответ 2



Событие AssemblyResolve Событие AssemblyResolve позволяет вмешаться в процесс и вручную загрузить сборку, которую CLR не может найти. Если это событие обрабатывается, то ссылаемые сборки можно распределять по различным местоположениям и по-прежнему обеспечивать их загрузку. Внутри обработчика события AssemblyResolve производится поиск сборки и ее загрузка за счет вызова одного из трех статических методов класса Assembly: Load, LoadFrom или LoadFile. Эти методы возвращают ссылку на вновь загруженную сборку, и данная ссылка затем возвращается вызывающему коду: static void Main() { AppDomain.CurrentDomain.AssemblyResolve += FindAssembly; ... } static Assembly FindAssembly (object sender, ResolveEventArgs args) { string fullyQualifiedName = args.Name; Assembly а = Assembly.LoadFrom(...); return а; } PS. Да, это необычное событие - оно имеет возвращаемый тип. При наличии множества обработчиков преимущество получает первый обработчик, который возвратил отличный от null объект Assembly. Литература: Албахари, Джозеф, Албахари, Бен. С# 6.0. Справочник. Полное описание языка, 6-е изд. : Пер. с англ. - М. : ООО "И.Д. Вильямс", 2016. - 1040 с.: ил. - Парал. тит. англ. ISBN 978-5-8459-2087-4 (рус.)

Комментариев нет:

Отправить комментарий