Вместо того, чтобы делать асинхронный вызов из 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-коду, что он готов - я оставлю это на ваше усмотрение.