Navision 5和COM Interop

时间:2013-01-22 09:58:53

标签: events com navision

在尝试了解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

感谢您的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:3)

有趣的问题。

自动化上的

WithEvents属性创建处理程序并将其附加到Elapsed委托,因此这不是NULL - 因此没有异常

但是,当WithEventsNo并且调用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中提出这个问题 - 有人可能会更清楚。