Fortran Coder

查看: 8961|回复: 3
打印 上一主题 下一主题

[混编] C# Fortran混合开发:在C#中调用Fortran的.dll显示异常

[复制链接]

5

帖子

2

主题

0

精华

入门

F 币
32 元
贡献
16 点
跳转到指定楼层
楼主
发表于 2020-12-29 22:14:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
求救大佬
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[i] + "");
            }
            double b = FortranMethod.Sortandfindmax(Array, Array.Length);
            Console.Write("\n" + "排序后:");
            for (int i = 0; i < Array.Length; i++)
            {
                Console.Write(Array[i] + "");
            }
            Console.WriteLine("\n" + "最大值为:");
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }

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

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

1609246065(1).jpg
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2020-12-30 08:32:34 | 只看该作者
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

5

帖子

2

主题

0

精华

入门

F 币
32 元
贡献
16 点
板凳
 楼主| 发表于 2020-12-30 09:37:56 | 只看该作者
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, 下载次数: 284)

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

5

帖子

2

主题

0

精华

入门

F 币
32 元
贡献
16 点
地板
 楼主| 发表于 2020-12-30 09:42:26 | 只看该作者
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, 下载次数: 301)

HNHJJ)XK_5@])GL`LDX%LFX.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 22:29

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表