.net - 从 C# 调用 Fortran dll 函数的堆栈溢出异常

标签 .net dll fortran wrapper

我有一个现有的 VB6 程序调用具有以下定义的 Fortran dll:

Declare Function START Lib "BackEndLib2.dll" Alias "_START@0" () As Integer

我们正在将 VB6 应用程序迁移到 C# (.net 4.0),现在定义如下:

[DllImport("BackEndLib2.dll", EntryPoint = "_START@0")]
public static extern short START();

但是,当我在 c# 中调用相同的函数调用时,它执行 dll 调用成功返回到托管代码,然后在一段时间后抛出堆栈溢出异常。

我也在 VB.net 中尝试了相同的 dll 调用,结果相同:

Declare Function START Lib "BackEndLib2.dll" Alias "_START@0" () As Short

知道为什么相同的函数调用在 .NET 4.0 中产生堆栈溢出异常但在 vb6 中成功运行吗?

我猜我正在用 dll 调用破坏堆栈,但我不确定。我尝试了许多不同的参数类型,但到目前为止没有任何效果。

编辑:这似乎只是 WPF 中的一个问题,如果我在 Windows 窗体中创建相同的示例,它不会崩溃。

最佳答案

您的 [DllImport] 声明等同于 VB6 声明语句。最好假设 VB6 声明一开始就是错误的,而你幸运地摆脱了它。返回类型很奇怪,但这不会导致堆栈问题,因为返回值是通过 CPU 寄存器而不是堆栈传递的。

使用 Debug + Windows + Registers 开始对此进行诊断。注意调用前后ESP的值。如果它不一样,那么你确实有一个声明问题,并且对该函数的大量调用可能会破坏堆栈。不太可能顺便说一句,这通常会生成 MDA 警告。如果匹配,则只能是 Fortran 代码溢出堆栈。

另请记住,您可能会指责错误的函数。生成 SOE 的函数可能不是搞砸堆栈的函数。查看 ESP 值可以让您快速找到麻烦制造者。

关于.net - 从 C# 调用 Fortran dll 函数的堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4462480/

相关文章:

.net - 无法使用 AutoHotkey 关闭某些进程

.net - 为什么我不能使用WPF 4.0中应用的Aero主题来设置控件的样式?

.NET 代码向存储在 Oracle DB 中的具有 1 或 3 个小数位的数字添加尾随 0

.net - 为什么要用asp :HyperLink

c++ - 编写可与多个版本的 Tcl 一起使用的 Tcl 扩展

oop - 在 Fortran 中扩展对象并覆盖过程而不延迟

exception - Fortran 中是否存在异常处理?

c# - 将 C# dll 导入到 C++ 托管代码 (.NET)

c++ - 许多功能的单个 DLL 入口点

arrays - 将派生类型作为数组传递