C #: MethodInfo.Вызов метода, который требует ввода от пользователя в процесс

#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. Как я могу заставить его тестировать несколько файлов без зависания каким-либо методом, требующим ввода пользователем?