1

在尝试了解 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);指.ElapsedmTimer

通常,在函数中Elapsed空。OnElapsed

我会很感激你的帮助。提前致谢。

4

1 回答 1

3

有趣的问题。

WithEvents自动化属性创建处理程序并将其附加到Elapsed委托,所以这个不是NULL- 因此没有例外

但是,当WithEventsisNoTimer.Start()被调用时,正如您正确地说的那样,即使(理论上)Elapseddelegate 为空,也不会出现异常。

对此的简单解释是,无论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();
}

同样,资产净值没有任何变化。

COM Timer请注意,如果从 .NET 项目中使用,则这两个更改的行为都符合预期。这让我觉得,NAV Interop 必须从自动化中捕获异常并在内部处理它们。

然而,我会在Mibuso中提出这个问题——那里的人可能会更清楚。

于 2013-01-22T11:27:21.680 回答