我们有一个用 Delphi 6 编写的应用程序,我们在其中生成并执行数学运算的机器代码(输入一个字符串 - >输出机器代码 - >调用很多次)。这已经很多(很多)年了。
我们最近添加了一些用C#编写的功能,并通过COM访问。 访问新功能可以正常工作。
如果计算中出现错误(例如超出范围或者除以0),我们就会遇到问题。
如果我们不创建了COM对象的实例[注意:我们这里没有使用COM对象,只需调用CreateOleObject()
来创建它],然后输入一个无效的计算(比如'1/0')我们得到一个我们可以陷阱和处理的异常。
但是,一旦我们创建了COM对象,我们就不再获得Div / 0异常。
- 我们第一次调用它时,会得到StackOverflow异常
- 我们第二次调用它时,会收到一个无法捕获的访问冲突异常并导致应用程序崩溃。
我认识到这在使用方面相当远,但如果有任何想法,我会很感激帮助。感谢。
更新:
事实证明,我们在应用程序中使用其他.Net程序集,通过COM访问它们并且它们不会导致问题。我创建了2个简单的程序集,并使它们可以访问COM。一个目标是.Net 2.0(N2),另一个是.Net 4.0(N4)。它们都包含相同的GetMessage()
函数来返回字符串。
他们都使用.Net 4注册 regasm (。Net 2 regasm 不认可4程序集有效)。如果我创建N2 COM对象的实例一切都很好但是创建N4 COM对象的实例会导致不良行为。在任何情况下我都不会调用GetMessage()
,我只是创建COM对象。
更新:
似乎问题是.Net版本相关
在具有.Net 4.0 Client的计算机上,div / 0给出堆栈溢出异常,然后(在第二次调用时)崩溃。
在.Net 4.5.1的机器上,我得到一个div / 0异常,一切正常。
有什么想法4.5.1和4.0(客户端)如何处理数学协处理器异常之间可能有什么不同?