Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Vilian
0 / 0 / 3
Регистрация: 17.12.2010
Сообщений: 88
#1

Как проверить наличие необходимых приложению библиотек во время его запуска - C# WPF

03.06.2012, 20:40. Просмотров 2932. Ответов 11
Метки нет (Все метки)

Есть приложение на WPF. В состав приложения входит файл exe файл и два dll. Если dll удалить, то программа, естественно, валится.

http://www.cyberforum.ru/csharp-net/thread158291.html
Как проверить наличие этих библиотек во время запуска приложения? Если вызвать с целью проверки данный метод в конструкторе exe файла, то не катит:
C#
1
2
3
4
private bool isAllLibrariesIsThere()
{
      return File.Exists("name1.dll") && File.Exists("name2.dll");
}
Какие еще есть способы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 20:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как проверить наличие необходимых приложению библиотек во время его запуска (C# WPF):

Вылет во время запуска при подключении динамических библиотек в проект с подпроектами
Здравствуйте! Я создал проект с поддиректориями на Qt (qt 5.4.1, mingw). У...

Как проверить наличие контролера или его метода по названию?
Для получения запрашиваемого контролера или метода можно использовать: ...

Как проверить наличие элемента и если он есть удалить его по клику
Приветствую, у меня есть код: var...

Как проверить текст на наличие контента определенного формата и выделить его?
Есть список из 30(например) открытых групп вконтакте. с периодичностью раз в 1...

Проверить наличие файла и при его отсутствии создать его
Напишите программу, которая работает в одном из двух режимов. Если в текущем...

11
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
03.06.2012, 21:12 #2
Если dll удалить, то программа, естественно, валится
использовать динамическое подключение библиотек.
0
Vilian
0 / 0 / 3
Регистрация: 17.12.2010
Сообщений: 88
03.06.2012, 21:21  [ТС] #3
Цитата Сообщение от raxp Посмотреть сообщение
использовать динамическое подключение библиотек.
Больше вариантов нет?
0
Петррр
6154 / 3454 / 896
Регистрация: 28.10.2010
Сообщений: 5,926
03.06.2012, 21:23 #4
http://msdn.microsoft.com/ru-ru/libr...exception.aspx
0
Vilian
0 / 0 / 3
Регистрация: 17.12.2010
Сообщений: 88
03.06.2012, 21:29  [ТС] #5
Цитата Сообщение от Петррр Посмотреть сообщение
Наверно я не там пытаюсь его ловить. Ну а где тогда?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public MainWindow()
        {
            try
            {
                InitializeComponent();
            }
            catch (DllNotFoundException)
            {
                MessageBox.Show("Ошибка. Не обнаружены библиотеки" +
                    " Приложение будет закрыто", "Критическая ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(-1);
            }
}
0
SergioDnDz
24 / 24 / 8
Регистрация: 27.02.2010
Сообщений: 74
03.06.2012, 21:35 #6
C#
1
2
3
4
5
6
7
8
9
10
11
12
Assembly ass;
 
        try
        {
             ass = Assembly.Load("ClassLibrary1");//загрузка библиотеки
        }
        catch 
        { 
            Console.WriteLine("Не получилось подключить зборку");
            Console.ReadLine();
            return;
        }
0
Lasur
258 / 248 / 43
Регистрация: 18.03.2012
Сообщений: 506
03.06.2012, 21:41 #7
Неужели программа крашится до вызова методов из dll?
0
Vilian
0 / 0 / 3
Регистрация: 17.12.2010
Сообщений: 88
03.06.2012, 21:48  [ТС] #8
Цитата Сообщение от Lasur Посмотреть сообщение
Неужели программа крашится до вызова методов из dll?
именно..

Добавлено через 55 секунд
SergioDnDz, увы, ловлю exception теперь XamlParseException, если помещаю подобный код в начало конструктора
0
Unril
786 / 677 / 109
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
04.06.2012, 01:28 #9
Попробуй ловить FileNotFoundException при создании экземпляра окна. В App.cs, к примеру.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
04.06.2012, 08:27 #10
Больше вариантов нет?
...а что вас не устраивает? Это наилучшее решение, тут и проверку на наличие DLL можно организовать и приложение будет запускаться при отсутствии присутствия.
0
Vilian
0 / 0 / 3
Регистрация: 17.12.2010
Сообщений: 88
04.06.2012, 16:57  [ТС] #11
Цитата Сообщение от raxp Посмотреть сообщение
...а что вас не устраивает? Это наилучшее решение, тут и проверку на наличие DLL можно организовать и приложение будет запускаться при отсутствии присутствия.
просто уже достаточно написано кода. Насколько я знаю, для динамического интерфейса необходимо использовать интерфейсы, то есть это повлечет за собой переработку всего кода.. Так не пойдет. Что может запускаться раньше конструктора в wpf? Если пишу вот такие строчки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public MainWindow()
        {
         
            try
            {
                Assembly.LoadFrom("lib1.dll");
                Assembly.LoadFrom("lib2.dll");
            }
            catch (Exception)
            {
                MessageBox.Show("Ошибка. Не обнаружены библиотек lib1.dll и (или) lib2.dll." +
                    " Приложение будет закрыто", "Критическая ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(-1);
            }
            InitializeComponent();
}
То наличие lib1 проверяется, а наличие lib2 нет! Из-за чего программа и падает. Тоже самое было и в случае:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public MainWindow()
        {
            if (!this.isAllLibrariesIsThere())
            {
                MessageBox.Show("Ошибка. Не обнаружены библиотеки lib1.dll и (или) lib2.dll." +
                    " Приложение будет закрыто", "Критическая ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(-1);
            }
            InitializeComponent();
        }
        private bool isAllLibrariesIsThere()
        {
            return File.Exists("lib1.dll") && File.Exists("lib2.dll");
        }
}
Кстати говоря, этот класс окна (ехе) имеет у себя полем объект класса из lib2, но я его инициализирую все-ровно в конструкторе. То есть сначала происходит проверка на dll, а потом уже инициализация! Ума не приложу где ошибка..

Добавлено через 26 минут
Найдено решение. Статический конструктор.
0
raxp
10180 / 6563 / 491
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
04.06.2012, 17:47 #12
повлечет за собой переработку всего кода.. Так не пойдет
честно, не смешите мои тапочки

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
0
04.06.2012, 17:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2012, 17:47
Привет! Вот еще темы с решениями:

Проверить наличие файла в директории программы, и, если его нет, создать его
Здравствуйте уважаемые форумчане. Сразу перейду к сути- рядом с основной...

Подключение необходимых библиотек
Вот эта тема: http://www.cyberforum.ru/win-api/thread1279459.html Исходник...

Проверить наличие файла и удалить его
Здравствуйте, подскажите как реализовать в bat такое ... Проверить наличие...

Получить свойство инфоблока и проверить его наличие
в инфоблоке есть 2 свойства FIRSTNAME (Обязательное) и SECONDNAME...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru