#c# #invoke #blocking #methodinfo
#c# #вызвать #блокировка #methodinfo
Вопрос:
У меня есть DLL-файл, внутри которого есть метод, который создает каталог FolderBrowserDialog и ожидает продолжения выбора пользователем. Вот его код:
public void setRoot() {
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
root = fbd.SelectedPath;
searchRoot();
}
}
Однако в другой программе я пытаюсь вызвать этот метод, и я получаю программу, ожидающую вечно. Я предполагаю, что вызывающая программа ожидает, пока FileBrowserDialog выберет файл. Это вывод:
MethodInfo.Вызов (объект класса, параметры)
Как я могу обойти это и заставить вызывающую программу выбрать каталог для этого вызываемого метода?
Комментарии:
1. Начните с показа нам некоторого кода
Ответ №1:
Метод, вызываемый с MethodInfo.Invoke
помощью, не отличается от метода, вызываемого непосредственно из кода. Это тот же код, который выполняется, все равно будет выполняться в том же потоке с теми же разрешениями, что и прямой вызов. Если ваш метод, вызванный отражением, зависает, хотя работает нормально без отражения, есть что-то еще, что вызывает это.
Судя по вашему скриншоту, вы запускаете его в консольном приложении. Я предполагаю, что другое приложение не является консольным приложением, что означает, что у него есть работающий насос сообщений, ожидающий сообщений Windows, что заставляет диалог работать. Запуск диалоговых окон Windows в консольном приложении не будет работать так просто.
Комментарии:
1. Я добавил [STAThread] перед моим основным, и да, он действительно вывел графический интерфейс. Тем не менее, я разрабатываю приложение, которое тестирует несколько библиотек DLL. Как я могу заставить его тестировать несколько файлов без зависания каким-либо методом, требующим ввода пользователем?