Winapp с wmplayer в нем который использует свою собственную DLL
У меня есть winapp с wmPlayer в нем, который использует свои собственные dll-файлы, чтобы на самом деле функционировать.
Но, когда я перемещаю свое приложение в другую папку, которая не содержит 2 dll, связанных с плеером в нем, мое приложение замораживается на 1 минуту и автоматически закрывается по умолчанию.
Я хочу, чтобы способ выскочить MessageBox с моей пользовательской ошибкой, чтобы напомнить себе (пользователю) об этом маленьком шаге; чтобы добавить dll-файлы с приложением внутри той же папки.
отредактировано#1
Мой скомпилированный exe-файл имеет эту проблему. Не проект против.
Когда я помещаю его с 2 dll-файлами в одну папку, то все в порядке, независимо от расположения папки на моем жестком диске. Проблема возникает, когда я забываю переместить dll-файлы в папку приложения.
Мой код работает нормально. Проблема заключается в том, что объект "player" запрашивает эти dll-файлы при инициализации формы. Я не думаю, что он даже проходит после InitializeComponent();
Проверьте, что я пробовал:
Я пробовал с 2 нитями.
Я пробовал с {try catch}.
Нет (хороших) результатов.
Спасибо.
public Form1() { InitializeComponent(); di = new DirectoryInfo(path); Thread thread1 = new Thread(new ThreadStart(A)); Thread thread2 = new Thread(new ThreadStart(B)); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } void A() { bool Interop = false; bool AxInterop = false; foreach (var file in di.GetFiles()) { //Interop.WMPLib.dll //AxInterop.WMPLib.dll if (file.Name == "Interop.WMPLib.dll") { Interop = true; } if (file.Name == "AxInterop.WMPLib.dll") { AxInterop = true; } } if (Interop & AxInterop) { } else { MessageBox.Show("Error: Interop.WMPLib.dll or AxInterop.WMPLib.dll is missing to run this player.\r\n Please put the 2 dll with this application in the same folder."); } }
Что я уже пробовал:
Я пробовал с 2 нитями.
Я пробовал с {try catch}.
Нет (хороших) результатов.
Richard MacCutchan
Почему вы используете потоки и GetFiles? Вы можете просто попробовать загрузить фактические библиотеки DLL, чтобы увидеть, присутствуют ли они.
_Q12_
Простите, если я недостаточно ясно выразился.
Мой скомпилированный exe-файл имеет эту проблему. Не проект против.
Вообще-то я прямо сейчас изменю свой первоначальный вопрос.
И если вы имеете в виду скомпилированный exe-файл, как я изначально предполагал, то да, когда я помещаю его с 2 dll-файлами в одну папку, то все в порядке, независимо от расположения папки на моем жестком диске.
Richard MacCutchan
Ну, вот как это должно работать. При попытке доступа к библиотеке DLL Windows будет искать ее в папках системной библиотеки, папках, указанных в переменной PATH, и, наконец, в папке, содержащей исполняемый файл. Если DLL не будет найдена, то программа завершится неудачей.
Richard MacCutchan
Каково значение параметра "путь", которое вы используете для получения информации о каталоге? Также прекратите использовать потоки для этого, они не служат никакой цели.
_Q12_
строковый путь = приложение.StartupPath;
и тогда я использую его: DirectoryInfo di = new DirectoryInfo(path);
Мой код работает нормально. Проблема заключается в том, что объект "VideoPlayer" запрашивает эти dll-файлы при инициализации формы. Я не думаю, что он даже проходит после InitializeComponent();
Как вы уже сказали, "Windows будет искать его(dll) в папках системной библиотеки" (которые находятся...где?)(вероятно, мне следует переместить эти dll-файлы туда, чтобы никогда не возникало этой проблемы в будущем?) Я хотел бы переместить их в пользовательскую папку, например основную, из которой каждая копия моего приложения будет "знать", где искать.
Еще одна особенность моего приложения заключается в том, что я копирую его там, где мне нужно, - в основном в папках фильмов,чтобы составить там список фильмов, циклировать их, сортировать, просматривать и т. д.
Richard MacCutchan
Вы должны установить приложение и dll-файлы в одну папку. Использовать либо программные файлы, программные файлы (x86) или папка AppData\местные\программы. Таким образом, вы знаете, что вся система готова к использованию.
0x01AA
Угадайте, почему ваш код не работает: сравнение строк, как и вы, чувствительно к регистру. Во всяком случае, я опубликовал решение, которое, как я надеюсь, более простое и, надеюсь, работает ;)