2011-12-16 20 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