大侠好,我用C#调用fortran的DLL文件,对两个项目分别编译,均显示成功。运行C#时出现以下错误,还请抽空帮忙指点,不胜感激!
托管调试助手“PInvokeStackImbalance”在“C:\Users\ZHL\Desktop\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe”中检测到问题。
其他信息: 对 PInvoke 函数“ConsoleApplication1!ConsoleApplication1.Program::Add”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
C#代码如下:
[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
[DllImport(@"C:\Users\ZHL\Desktop\ConsoleApplication1\Dll1\Debug\Dll1.dll", EntryPoint = "Add")] //指定DLL路径,声明外部Add
extern static int Add(int A,int B);
static void Main(string[] args)
{
int c = Add(1,2);
Console.WriteLine(c); //打印c值,正确值为3
Console.Read();
}
}
}
FORTRAN中代码如下:
[Fortran] 纯文本查看 复制代码 subroutine Add(A,B) Bind(C,Name="Add")
!DEC$ ATTRIBUTES DLLEXPORT :: Add
use , Intrinsic :: ISO_C_Binding
implicit none
integer A,B
return A+B
RETURN
end subroutine
补充说明:我担心是不是fortran区分大小写导致错误,把C#和fortran程序中Add都改为ADD也出现同样的问题,如果需要,我可以把整个文件传上来。
|