Delphi 6:通过COM引用.Net程序集时调用机器代码时出错

Delphi 6:通过COM引用.Net程序集时调用机器代码时出错,.net,delphi,com,machine-code,.net,Delphi,Com,Machine Code,我们有一个用Delphi6编写的应用程序,其中我们生成并执行数学运算的机器代码(输入字符串->输出机器代码->多次调用)。多年来,这种方法一直运作良好 我们最近添加了一些用C#编写并通过COM访问的功能。 访问新功能可以正常工作 如果计算中有错误(例如超出范围或除以0),我们就有问题了 如果我们没有创建COM对象的实例[注意:我们在这里没有使用COM对象,只是调用CreateOleObject()来创建它],然后输入一个无效的计算(例如,“1/0”),我们会得到一个异常,我们可以捕获并处理它 然

我们有一个用Delphi6编写的应用程序,其中我们生成并执行数学运算的机器代码(输入字符串->输出机器代码->多次调用)。多年来,这种方法一直运作良好

我们最近添加了一些用C#编写并通过COM访问的功能。 访问新功能可以正常工作

如果计算中有错误(例如超出范围或除以0),我们就有问题了

如果我们没有创建COM对象的实例[注意:我们在这里没有使用COM对象,只是调用
CreateOleObject()
来创建它],然后输入一个无效的计算(例如,“1/0”),我们会得到一个异常,我们可以捕获并处理它

然而,一旦我们创建了COM对象,我们就不再得到Div/0异常
-第一次调用它时,会出现StackOverflow异常。
-第二次调用时,我们会得到一个无法捕获的访问冲突异常,并导致应用程序崩溃。

  • 只要计算中没有错误,它就会正确执行
  • 只要没有创建COM对象,我们就可以任意多次调用无效的计算,每次都会得到Div/0错误
  • COM对象与计算无关,并且从未被调用,它似乎只是在创建它,这会导致问题
  • 目标计算机已安装.NET 4客户端配置文件和.NET 4扩展框架
我承认这在使用上是非常遥远的,但是如果有人有任何想法,我将非常感谢您的帮助。谢谢

更新:
事实证明,我们在应用程序中使用其他.Net程序集,通过COM访问它们,并且它们不会导致问题。我已经创建了两个简单的程序集,并使它们可以COM访问。一个以.NET2.0(N2)为目标,另一个以.NET4.0(N4)为目标。它们都包含相同的
GetMessage()
函数来返回字符串

它们都是使用.Net 4regasm注册的(.Net 2regasm不承认4程序集有效)。如果我创建了一个N2 COM对象的实例,这一切都是好的,但是创建了一个N4 COM对象的实例会导致不良行为。在这两种情况下,我都不会调用
GetMessage()
,我只是创建COM对象

更新:
问题似乎与.Net版本有关。
在使用.Net 4.0客户端的计算机上,div/0会出现堆栈溢出异常,然后(在第二次调用时)崩溃
在装有.Net 4.5.1的机器上,我得到一个div/0异常,一切正常。

有什么想法吗?4.5.1和4.0(客户端)处理数学协处理器异常的方式有什么不同?

听起来像是代码中的错误。试着做一些调试,问问自己堆栈是如何溢出的?我本来会这样想,但我已经把它带到了一个小测试应用程序中。我现在没有主意了。我确实认为可能需要一些缩小范围和一些核心调试。祝你好运@大卫·赫弗南,谢谢你的关注。我正在给我的评论写编辑,因为我花了太长时间,所以它超时了。我正要说——我本以为是的,但我已经创建了一个小测试应用程序。它只包含一次计算的机器代码->1/0。如果运行此操作,我将通过0异常获得预期的div。如果我在启动中添加一行来创建COM对象(没有其他更改),div by 0将变成stackoverflow,然后成为访问冲突。我看不到任何地方可能发生stackoverflow——再次感谢。@a如果您创建了一个不同的COM对象,除了您所写的以外,还有其他的东西吗?一些普遍可用的东西会生成一个简单的MCVE,你可以添加到你的问题中——当然,如果它复制了这个问题的话。如果没有,那么你可以把注意力集中在你的C#代码上。