在尝试了解Navision 5如何通过COM互操作与外部应用程序通信时,我发现了以下示例:
http://msdn.microsoft.com/en-us/library/aa973247.aspx
实施的第二个案例正是我想要做的。我测试了代码(稍作修改 - 在事件接口和类上添加了一些属性[ComVisible(true)]
),并且通过这些修改,它按照示例中的说明工作。
但是,我无法理解为什么我们在通过以下方式调用COMTimer.Elapsed
时没有例外。
protected virtual void OnElapsed(EventArgs e)
{
Elapsed();
}
谁迷上了这个活动?我能看到的唯一“钩子”是引用mTimer.Elapsed += new ElapsedEventHandler(mTimer_Elapsed);
的{{1}}事件的Elapsed
。
通常,mTimer
函数中Elapsed
null 。
感谢您的帮助。提前谢谢。
答案 0 :(得分:3)
有趣的问题。
自动化上的 WithEvents
属性创建处理程序并将其附加到Elapsed
委托,因此这不是NULL
- 因此没有异常
但是,当WithEvents
为No
并且调用Timer.Start()
时,正确地说没有异常冒泡,即使(理论上)Elapsed
委托为空
对此的简单解释是,无论WithEvents
属性如何,NAV都会附加空委托。为了支持这一点,如果你将代码置于Timer::Elapsed()
触发器中,然后取消WithEvents
,然后将其恢复 - 代码仍然存在(即触发器仍然以未更改的形式存在),这使我精益结论是它总是存在(即空委托)。
但当然这是资产净值所以它不可能那么简单。
我从上面的MSDN示例创建了一个测试代码单元,但对自动化进行了一些小改动:
/// <summary>
/// Whenever the internal timer elapses, an event must be fired
/// </summary>
private void mTimer_Elapsed(object sender, ElapsedEventArgs e)
{
OnElapsed(EventArgs.Empty);
throw null;
}
理论上,每当调用NULL
时,这应该抛出mTimer_Elapsed
- 但是在NAV中没有任何东西冒泡。我走得更远,改变了这个:
///<summary>
/// Invoke the Changed event; called whenever the internal timer elapses
/// </summary>
protected virtual void OnElapsed(EventArgs e)
{
throw new InvalidCastException("test");
//Elapsed();
}
同样,净资产值没有任何变化。
请注意,如果在.NET项目中使用COM Timer
,则两个更改都会按预期运行。这让我想到,NAV Interop必须从自动化中捕获异常并在内部处理它们。
然而,我会在Mibuso中提出这个问题 - 有人可能会更清楚。