Events Navision 5和COM互操作

Events Navision 5和COM互操作,events,com,navision,Events,Com,Navision,在试图了解Navision 5如何通过COM互操作与外部应用程序通信时,我发现了以下示例: 实施的第二个案例正是我想要做的。我测试了代码(稍作修改-在events接口和类上添加了一些属性[ComVisible(true)]),通过这些修改,代码可以按照示例中的说明工作 但是,我无法理解为什么通过以下命令调用COMTimer.appeased时没有出现异常 protected virtual void OnElapsed(EventArgs e) { Elapsed(); } 谁对这件事感

在试图了解Navision 5如何通过COM互操作与外部应用程序通信时,我发现了以下示例:

实施的第二个案例正是我想要做的。我测试了代码(稍作修改-在events接口和类上添加了一些属性
[ComVisible(true)]
),通过这些修改,代码可以按照示例中的说明工作

但是,我无法理解为什么通过以下命令调用
COMTimer.appeased
时没有出现异常

protected virtual void OnElapsed(EventArgs e)
{
  Elapsed();
}
谁对这件事感兴趣?我能看到的唯一“钩子”是
mTimer.appeased+=newelapsedeventhandler(mTimer\u appeased)指的是
mTimer
已用事件

正常情况下,
onepersed
函数中的
eapersed
将为空

谢谢你的帮助。提前谢谢。

有趣的问题

自动化上的
WithEvents
属性创建处理程序并将其附加到
Expressed
委托,因此此处理程序不是
NULL
-因此没有异常

但是,当
with events
No
时,调用了
Timer.Start()
,正如您正确地说的那样,不会出现异常,即使(理论上)经过的
委托为空

对此的简单解释是,NAV附加空委托,而不考虑
WithEvents
属性。为了支持这一点,如果您将代码放入
Timer::appead()
trigger,然后取下
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;
} 
同样,NAV中没有发生任何事情

请注意,如果从.NET项目中使用
COM计时器
,则这两个更改的行为与预期一致。这让我想到,NAV互操作必须从自动化中捕获异常并在内部处理它们


不过,我会提出这个问题,那里的人可能会知道得更清楚。

谢谢。请记住,当您从未设置为SingleInstance的codeunit(假设在其OnRun触发器上)调用外部过程(将引发事件以侦听)时,当OnRun()完成其执行时,codeunit“死亡”,NAV将永远不会侦听事件。如果希望能够侦听此事件,请使用以下方法之一。或者,将Codeunit设置为SingleInstance,或者放置NAV处理程序并以NAV形式启动外部过程,该过程将使用事件信息,并且在外部代码运行时保持活动状态。
///<summary>
/// Invoke the Changed event; called whenever the internal timer elapses
/// </summary>
protected virtual void OnElapsed(EventArgs e)
{
    throw new InvalidCastException("test");
    //Elapsed();
}