Вызов асинхронного метода C # из приложения VB6 - PullRequest
0 голосов
/ 21 января 2010

У меня есть C # dll, который при вызове основного метода открывает форму окна. Эта dll в настоящее время доступна через VBA приложением поставщика. Проблема в том, что когда вызывается dll и открывается форма, пользователь теряет возможность взаимодействовать с приложением поставщика. Я надеялся, что если я смогу изменить dll для поддержки асинхронного вызова, тогда элемент управления можно будет вернуть вызывающему приложению, чтобы позволить пользователю перелистывать страницы, увеличивать или уменьшать масштаб и т. Д. Затем, как только пользователь завершит всплывающее окно Если у нас может быть обратный вызов или что-то еще, чтобы вернуть информацию в настройки приложения vba.

1 Ответ

2 голосов
/ 21 января 2010

Вместо того, чтобы делать асинхронный вызов из VB, было бы гораздо проще изменить код C #, чтобы открыть окно асинхронно, а затем вернуть.

Вы можете сделать это, просто изменив строку, открывающуюокно от .ShowDialog() до .Show().

Очевидно, что это может быть не вариант, если у вас нет доступа к коду C # dll, но я подумал, что предложу его.


Если вы решите перейти на использование Show() вместо ShowDialog(), возможно, вам придется обрабатывать результаты диалога по-другому.

Ваш новый код будет выглядеть примерно так:

MyForm win = new MyForm();
win.Show();

Немодальное диалоговое окно не блокирует вызывающий код, поэтому ваш вызывающий код будет продолжаться без ожидания результата.

Самый простой способ справиться с этим - подключить обработчик события к .OnClosed событие формы .Это будет вызвано, когда пользователь закрывает форму.

MyForm win = new MyForm();
win.OnClosed += new EventHandler<FormClosedEventArgs>(YourEventHandlerMethod)
win.Show();

Вы можете добавить публичное логическое свойство к форме (с частным установщиком), которое вы устанавливаете внутренне при нажатии кнопок ok / cancel (наряду с вызовом метода close).Затем вы можете проверить это свойство после того, как форма закрыта из вашего закрытого обработчика.(Свойство sender будет вашей ссылкой на форму, вам просто нужно сначала привести ее к правильному типу).

Таким образом, ваш метод обработчика событий будет выглядеть так:

private void EventHandler<FormClosedEventArgs> YourEventHandlerMethod(Object sender, FormClosedEventArgs e)
{
    MyForm f = (MyForm)sender;
    bool result = f.TheResultProperty;

    // Now do your callback.
}

Наконец, теперь у вас есть код, который запускается после закрытия формы и имеет доступ к результату формы, вам просто нужно сообщить вашему VBA-коду, что он готов - я оставлю это на ваше усмотрение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...