我们正在将应用程序从C#迁移到VB以满足我们项目的需求,但偶然发现VB中的事件处理问题。
应用程序使用COM Wrapper访问Silverlight中的扫描程序。该对象在代码中动态创建,并且事件被添加到“AcquirePage”。这当然需要提高信任度。
C#中的代码:
dynamic TwainSession;
(...)
TwainSession.AcquirePage += new AcquirePageDelegate(AcquirePageEventHandler);
由于VB中唯一真正的“等效”动态是对象,我们使用:
Private TwainSession As Object
我们想要处理此Object的事件,一切都很好。因为我们在Silverlight中,所以我们无法了解Object的结构或事件,因此需要动态创建它。在C#中,我们只需使用“+ =”为事件添加处理程序,但是:
AddHandler TwainSession.AcquirePage, AddressOf AcquirePageEventHandler
在VB中给出: 'AcquirePage'不是'对象'的事件
有什么方法吗?
答案 0 :(得分:0)
我认为答案是使用Option Strict
关闭进行编译,但无法重现问题我无法确定。
答案 1 :(得分:0)
无法找到在VB中执行此操作的解决方案,我们采用了这种方式:
构造函数接受两个参数,即动态对象和事件处理程序的地址,并执行添加处理程序的C#方法:
public TwainHandler(动态twainSession,Delegate eventHandler) { twainSession.AcquirePage + = eventHandler; }
构建了C#库,并添加了dll作为VB项目的参考。
Dim t as TwainHandler = New TwainHandler(TwainSession,New AcquirePageDelegate(AddressOf AcquirePageEventHandler))
这样C#库就会动态地为事件添加处理程序(指向VB应用程序中的方法)。如果有人有更好的解决方案,请分享。