2011-12-16 46 views
0

我們正在將應用程序從C#移植到VB以滿足我們項目的需求,但偶然發現了VB中的事件處理問題。Silverlight VB AddHandler動態對象

該應用程序使用COM Wrapper訪問Silverlight中的掃描器。該對象是在代碼中動態創建的,並且事件添加到「AcquirePage」。這當然需要提升信任。

代碼在C#:

dynamic TwainSession; 
(...) 
TwainSession.AcquirePage += new AcquirePageDelegate(AcquirePageEventHandler); 

由於在VB 動態唯一真正的 「等價物」 對象,我們使用:

Private TwainSession As Object 

一切都很好,直到點我們想要處理這個對象的事件。因爲我們在Silverlight中,所以我們無法瞭解對象的結構或事件,因此需要動態創建它。在C#中,我們簡單地用 「+ =」 的處理程序添加到一個事件,而是:

AddHandler TwainSession.AcquirePage, AddressOf AcquirePageEventHandler 

在VB中得到:'AcquirePage' 不是 '對象'

任何方式的事件在那附近?

+0

有趣的問題,但它需要澄清,你可以擴大一點,並填寫背景,讓有人可以複製問題嗎? – 2011-12-16 14:05:23

回答

0

無法找到一個解決方案中VB做到這一點,我們就這樣理解:

  1. 增加了一個新項目:Silverlight的C#類庫
  2. 構造需要兩個參數,即動態對象和事件處理函數的地址,並執行添加處理程序的C#方法:

    public TwainHandler(dynamic twainSession,代表eventHandler) { twainSession.AcquirePage + = eventHandler; }

  3. 該C#庫已建成,並將該DLL添加爲對VB項目的引用。

    昏暗噸作爲TwainHandler =新TwainHandler(TwainSession,新AcquirePageDelegate(AddressOf AcquirePageEventHandler))

這樣,C#庫增加了對事件處理程序(其指向的方法在我們的VB應用程序)動態。如果有人有更好的解決方案,請分享。

0

認爲答案是Option Strict編譯關但沒有能夠重現我不能確定的問題。

參見:Early and Late Binding

+0

感謝您的回答,但問題是如何將處理程序添加到動態對象(Dim x as Object)。 C#通過以下方式輕鬆實現: x.AnyEventName + = new eventDelegate(EventHandler) – 2011-12-19 07:17:15