2010-01-20 54 views
0

我有一個C#DLL,當調用main方法時,它會打開一個窗體。這個DLL當前是通過供應商應用程序通過VBA訪問的。問題是當dll被調用並且表單打開時,用戶失去了與供應商應用程序交互的能力。我希望如果我可以修改dll以支持異步調用,那麼可以將控件返回到調用應用程序,以允許用戶打開頁面,放大或縮小等。然後,一旦用戶完成彈出窗口表單,我們可以回調或返回信息到vba應用程序自定義。從VB6應用程序調用C#異步方法

+0

這應該有所幫助:http://www.codeproject.com/KB/vbscript/AsyncSample.aspx – 2010-01-20 21:41:13

回答

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一些代碼代碼知道它已經準備好了 - 我會把這個留給你。

+0

我在前段時間看過,然後我看到的問題是,我正在使用對話框結果來了解是否用戶取消了表單或點擊了角落中的X等,我會再次查看這個。 – Brian 2010-01-20 21:51:57

+0

這比修改你的VBA代碼來調用異步要容易得多。我會修改我的答案,以包含處理Show&ShowDialog之間差異的一些提示。 – 2010-01-20 22:02:48

+0

@布萊恩。查看更新。 – 2010-01-20 22:25:43