Events Navision 5和COM互操作
在试图了解Navision 5如何通过COM互操作与外部应用程序通信时,我发现了以下示例: 实施的第二个案例正是我想要做的。我测试了代码(稍作修改-在events接口和类上添加了一些属性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(); } 谁对这件事感
[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();
}