从VB6应用程序调用C#异步方法

时间:2010-01-20 21:38:15

标签: c# vb6 asynchronous

我有一个C#dll,当调用main方法时,它会打开一个窗体。此dll当前由供应商应用程序通过VBA访问。问题是,当调用dll并打开表单时,用户将失去与供应商应用程序交互的能力。我希望如果我可以修改dll以支持异步调用,那么控件可以返回到调用应用程序以允许用户翻页,放大或缩小等。然后一旦用户完成弹出窗口我们可以使用回调或其他方式将信息返回给vba应用程序自定义。

1 个答案:

答案 0 :(得分:2)

不是从VB进行异步调用,而是更容易修改C#代码以异步打开窗口,然后返回。

您只需将打开窗口的行从.ShowDialog()更改为.Show()即可。

显然,如果您无法访问C#dll的代码,这可能不是一个选项,但我认为我会建议。


如果您决定更改为使用Show()而不是ShowDialog(),则可能需要以不同方式处理对话框结果。

你的新代码看起来像这样:

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

非模态对话框不会阻止调用代码,因此您的调用代码将继续而不等待结果。

处理此问题的最简单方法是将事件处理程序附加到表单.OnClosed event。然后在用户关闭表单时触发此操作。

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

您可以在按下确定/取消按钮时在内部设置的窗体(使用私有设置器)添加公共布尔属性(同时调用close方法)。然后,您可以在已关闭的处理程序中关闭表单后检查此属性。 (发件人属性将是您对表单的引用,您只需先将其强制转换为正确的类型。)

所以你的事件处理程序方法将如下所示:

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

    // Now do your callback.
}

最后,现在你有一些代码在表单关闭后运行,并且可以访问表单结果,你只需要让你的VBA代码知道它已经准备好了 - 我会把它留给你。