ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:477.56KB ,
资源ID:8726284      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8726284.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C#与Fortran混合编程本地调用Fortran动态链接库.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C#与Fortran混合编程本地调用Fortran动态链接库.docx

1、C#与Fortran混合编程本地调用Fortran动态链接库C#与Fortran混合编程-本地调用Fortran动态链接库Fortran是一门古老的语言,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。然而Fortran程序本身不适合开发独立的应用程序,例如我们传统的桌面应用或者Web应用。因此这里我们便想将C#与Fortran结合,C#借助Fortran可以实现精度更高,计算更快的程序,而Fortran通过C#,便也能够达到可视化设计。一、基本思路运用Fortran,编写动态链接库(DLL),

2、在DLL中提供计算的函数接口,然后在C#中调用该DLL中计算部分的函数,实现计算过程。这里需要注意的是,由于我们使用的是Fortran编译器,生成的DLL属于第三方非托管DLL,因此无法直接在程序中添加DLL的引用。具体的做法将在后续部分说明。二、编写Fortran程序,生成动态链接库文件知道思路之后便开始正式的Coding。首先新建一个空的Fortran Dynamic-link Library项目。在Intel(R) Visual Fortran点击Library,选中右图的Dynamic-link Library.然后点击OK.这时的项目如下所示:点击Sources File文件夹,选择

3、新建项。添加一个新的Fortran文件然后便开始Fortran代码的编写工作。这里我们主要实现两个方法:一个方法是求两个数相加之和,并返回结果。另一个是输入一个数组,对这个数组进行排序,并找出最大值,最后返回排序后的结果,并返回最大值。这里我们分别演示的是Fortran传出一个数和一个数组有何不同。关于Fortran的基本语法不是本文的讨论范畴,请读者自行查阅资料。下面给出的上述我们要实现的功能的具体Fortran代码:DOUBLE PRECISION FUNCTION ADD(A,B)!DEC$ ATTRIBUTES DLLEXPORT:ADD!DEC$ ATTRIBUTES STDCALL

4、,ALIAS:Add:ADD DOUBLE PRECISION: A,B ADD=A+BENDFUNCTION SORTANDFINDMAX(ARRAY,LENGTH)!DEC$ ATTRIBUTES DLLEXPORT:SORTANDFINDMAX!DEC$ ATTRIBUTES STDCALL,ALIAS:Sortandfindmax:SORTANDFINDMAXDOUBLE PRECISION :ARRAY(LENGTH)INTEGER:I,JDOUBLE PRECISION:SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DO I=1,LENGTH-

5、1 DO J=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J) THEN TEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMP SORTANDFINDMAX=ARRAY(J) END IF END DO END DOEND上面我们声明了两个Fortran函数,一个是计算两个数相加,一个是选择排序并找出最大值。之后我们点击Visual Studio的Build Solution.开始编译成DLL。关于代码段解释:!DEC$ ATTRIBUTES DLLEXPORT:ADD!DEC$ ATTRIBUTES STDCALL,ALIAS:Add:AD

6、D这两句代码很关键。下面通过三个一致来简单的说一下以上代码段的意思和C#调用需要注意的问题。1.函数名一致:在Fortran编译器中默认的导出函数名全部是大写形式。而在C#中调用Fortran Dll时必须指定函数名一致。在Fortran方面解决的办法是:使用ALIAS(别名)属性指定导出函数名。例如对于下面的Fortran函数:DOUBLE PRECISION FUNCTION ADD(A, B)!DEC$ ATTRIBUTES DLLEXPORT: ADDDOUBLE PRECISION A,BADD =A+BEND对应的C#声明为:DllImport(MathDll)privatesta

7、ticexterndouble ADD (double A, double B);使用ALIAS修改后的定义如下:Double Precision Function ADD (A, B)!DEC$ ATTRIBUTES DLLEXPORT: ADD!DEC$ ATTRIBUTES ALIAS:Add : AddDouble Precision A,BAdd =A+BEnd对应的C#声明为:DllImport(MathDll)privatestaticexterndouble Add (double A, double B);而在C#中提供的解决方案是:通过使用Dlllmport的EntryPo

8、int属性指定导出的Fortran函数名。例如:Double Precision Function ADD(A, B)!DEC$ ATTRIBUTES DLLEXPORT: ADDDOUBLE PRECISION A,BADD =A+BEND对应的C#声明为:DllImport(MathDll,EntryPoint = ADD )privatestaticexterndouble Plus(double A, double B);此外,还可以使用 .NET Framework提供的dumpbin.exe工具查看DLL导出的函数名称。 A. 在开始菜单中打开Microsoft Visual St

9、udio 2010/Visual Studio Tools/ Visual Studio 2010 命令提示。 B 在命令提示窗体中将路径指向编译生成.dll文件的路径,然后输入以下命令: dumpbin /exports FileName.dll即可查看当前目录下FileName.dIl中导出的所有函数信息。2. 堆栈管理一致堆栈管理约定包括:在调用过程中子例程接受参数的数目和顺序,调用完成后由哪一方来清理堆栈等。C#语言在windows平台上的调用模式默认为StdCall模式,既由被调用方清理堆栈。而Fortran语言则默认由调用方清除。因此必须统一调用双方的堆栈清除方式才能保证2种语言间

10、的正常函数调用。这一约定在Fortran语言或C#语言中均可以采取措施进行统一。在Fortran语言中可以通过编译指令“!DEC$”后的可选项“C”或“STDCALL”参数来实现:A.!DEC$ ATTRIBUTES STDCALL :Object该语句语句中的STDCALL模式指定由被调用方清除堆栈(其中“Object”为变量名或函数名)。B.!DEC$ ATTRIBUTES C : Object该语句中的C模式声明由主调函数清除堆栈(但在传递数组和字符串参数时不能用此方法指定)。如果在C#语言内做改动,则需要在DllImport属性中设置CallingConvention字段的值为Cdec

11、l(表示由调用方清理堆栈)或StdCall(表示由被调用方清理堆栈)。DllImport(FileName.dll, CallingConvention =CallingConvention.StdCall)DllImport(FileName.dll, CallingConvention = CallingConvention.Cdecl)只有当Fortran程序和C#程序的堆栈管理一致时,才能保证正常的调用。3.参数类型保持一致在Fortran中常用的数据参数类型有:REAL:表示浮点数据类型,即小数,等价于C#的float,INTEGER:表示整数类型,相当于C#的int数据类型DOUB

12、LEPRECISION:表示双精度数据类型,相当于C#的double数据类型。 在C#调用Fortran DLL是必须保证参数的一致性,例如在Fortran中变量定义的是REAL类型,而我们传入的是Double,那么就会出现计算错误。三、编写C#代码调用Fortran DLLC#调用的Fortran的过程很简单,只需要注意上述说的几个问题即可。这里我们先新建一个控制台应用程序:然后将我们编译的Fortran项目所生成的DLL拷贝到控制台应用程序的Debug文件夹下。接着我们添加一个类:FortranMethod.cs该类用来调用Fortran DLL。代码如下:using System;usi

13、ngSystem.Text;usingSystem.Runtime.InteropServices;namespaceMixedProgrampublicstaticclassFortranMethod DllImport(TestDll.dll,CallingConvention =CallingConvention.Cdecl)publicstaticexterndouble Add(double a, double b); DllImport(TestDll.dll, CallingConvention =CallingConvention.Cdecl)publicstaticexter

14、ndoubleSortandfindmax(double array, int length); 关于C#调用注意的事项在上面已说明,在此不再讨论。然后在Main函数中测试我们的Fortran DLL。示例代码如下:using System;usingSystem.Collections.Generic;usingSystem.Text;namespaceMixedProgramclass Program staticvoid Main(string args) Console.WriteLine(请输入两个数相加:);double num1=Convert.ToDouble(Console.

15、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 (inti = 0; iArray.Length; i+)Console.Write(Arrayi+);double b=Fort

16、ranMethod.Sortandfindmax(Array, Array.Length);Console.WriteLine(n+排序后:);for (inti = 0; iArray.Length; i+)Console.Write(Arrayi+);Console.WriteLine(n+最大值为:);Console.WriteLine(b);Console.ReadKey(); 到此为止,所以的工作已经完成,下面看一下结果:到此为止,C#与Fortran编程的小示例就已经完成了。总结:本文主要演示了如何使用C#调用Fortran的DLL来实现相关的计算工作。并主要讲了C#调用时应该注意的事项。在工程计算中如果对于精度要求较高,计算较复杂时,我们便可以考虑通过C#与Fortran的混合编程来达到所需的要求。本文是基于本地调用Fortran DLL,下一篇将讲解基于Web调用Fortran DLL.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1