#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 (рус.)
Комментариев нет:
Отправить комментарий