Fortran Coder

标题: C# Fortran混合开发:在C#中调用Fortran的.dll显示异常 [打印本页]

作者: Chastar    时间: 2020-12-29 22:14
标题: C# Fortran混合开发:在C#中调用Fortran的.dll显示异常
求救大佬
https://www.cnblogs.com/potential/archive/2012/11/05/2755899.html依据这篇博客进行的操作,显示异常为
[url=]图片[/url]
Fortran编译器用的Intel Parallel Studio XE 2019,项目为.Net FrameWork 4框架下的Fortran Dynamic-link Library,新建.f90文件,代码如下:
[Fortran] 纯文本查看 复制代码
DOUBLE PRECISION FUNCTION ADD(A,B)
!DEC$ ATTRIBUTES DLLEXPORT::ADD
!DEC$ ATTRIBUTES STDCALL,ALIAS:'Add'::ADD
    DOUBLE PRECISION:: A,B
    ADD=A+B
END

FUNCTION SORTANDFINDMAX(ARRAY,LENGTH)
!DEC$ ATTRIBUTES DLLEXPORT::SORTANDFINDMAX
!DEC$ ATTRIBUTES STDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAX
DOUBLE PRECISION ::ARRAY(LENGTH)
INTEGER::I,J
DOUBLE PRECISION::SORTANDFINDMAX,TEMP
SORTANDFINDMAX=ARRAY(1)
DO I=1,LENGTH-1
    DO J=I+1,LENGTH
        IF(ARRAY(I).GT.ARRAY(J)) THEN
            TEMP=ARRAY(I)
            ARRAY(I)=ARRAY(J)
            ARRAY(J)=TEMP
            SORTANDFINDMAX=ARRAY(J)
            END IF
    END DO
    END DO
END

解决方案生成成功,并将生成的。dll文件放到相应c#解决方案的Debug中。
在VS2019,C#控制台应用(基于.Net FrameWork 4)中编写的调用代码如下:
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace MixedProgram
{
    public static class FortranMethod
    {
        [DllImport("TestDll.dll" ,CallingConvention = CallingConvention.Cdecl)]
        public static extern double Add(double a, double b);

        [DllImport("TestDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Sortandfindmax(double[] arry, int length);
    }
}

Main方法下的执行代码如下:
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MixedProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            //测试第一个方法
            Console.WriteLine("请输入两个数相加");
            double num1 = Convert.ToDouble(Console.ReadLine());
            double num2 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("输入的两个数是:" + num1 + "," + num2);
            double sum = FortranMethod.Add(num1, num2);
            Console.WriteLine("求和结果是:" + sum);
            //测试第二个方法
            double[] Array = { 1, 5, 2, 4, 3, 7, 6 };
            Console.WriteLine("初始数组:");
            for (int i = 0; i < Array.Length; i++)
            {
                Console.Write(Array + "");
            }
            double b = FortranMethod.Sortandfindmax(Array, Array.Length);
            Console.Write("\n" + "排序后:");
            for (int i = 0; i < Array.Length; i++)
            {
                Console.Write(Array + "");
            }
            Console.WriteLine("\n" + "最大值为:");
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }

启动出现错误:引发的异常:“System.BadImageFormatException”(位于 MixedProgram.exe 中)
“System.BadImageFormatException”类型的未经处理的异常在 MixedProgram.exe 中发生
试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

1609246065(1).jpg (21.52 KB, 下载次数: 248)

1609246065(1).jpg

作者: fcode    时间: 2020-12-30 08:32
DOUBLE PRECISION FUNCTION ADD(A,B)
!DEC$ ATTRIBUTES DLLEXPORT::ADD
!DEC$ ATTRIBUTES STDCALL,ALIAS:'Add'::ADD
    DOUBLE PRECISION:: A,B
    ADD=A+B
END

改为
[Fortran] 纯文本查看 复制代码
Real(kind=8) FUNCTION Add(A,B) Bind(C,Name="Add")
!DEC$ ATTRIBUTES DLLEXPORT::Add
    Real(8) , value :: A,B
    ADD=A+B
END Function Add

作者: Chastar    时间: 2020-12-30 09:37
fcode 发表于 2020-12-30 08:32
DOUBLE PRECISION FUNCTION ADD(A,B)
!DEC$ ATTRIBUTES DLLEXPORT::ADD
!DEC$ ATTRIBUTES STDCALL,ALIAS:'A ...

感谢解答但改了过后还是不行,出现同样的错误,我看网上说是要将VS跟啥Intel Parallel Studio XE 2019绑定,不太懂,会使这个原因吗。还有如果我想研究C#与fortran混编,请问哪有相应的资料呀,VS的帮助文件有吗,还是说要去Itel官网找

T0)M3~M(0()93%[]1NB{5`8.png (39.62 KB, 下载次数: 251)

T0)M3~M(0()93%[]1NB{5`8.png

作者: Chastar    时间: 2020-12-30 09:42
Chastar 发表于 2020-12-30 09:37
感谢解答但改了过后还是不行,出现同样的错误,我看网上说是要将VS跟啥Intel Parallel Studio XE 2019绑 ...

会不会是这个原因,我安装IVF的时候vs里未安装C++的库

HNHJJ)XK_5@])GL`LDX%LFX.png (175.54 KB, 下载次数: 268)

HNHJJ)XK_5@])GL`LDX%LFX.png





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2