从Fortran调用C#

时间:2013-04-08 05:25:33

标签: c# fortran fortran-iso-c-binding

我没有在Stack Overflow上找到任何关于从Fortran调用C#的帖子(我使用的是安装了Intel Visual Fortran的Visual Studio 2010)。但是,有一个(非常)有限的帖子[123]讨论了从fortran调用C / C ++。

在对这些帖子的一个回复中,有人建议从Fortran调用C ++比调用C更棘手,这让我怀疑C#可能比较棘手吗?缺乏C / C ++ / C#的基础,我想知道C / C ++的程序是否适用于C#?

我在这些帖子中注意到的一个共性是需要名为ISO_C_BINDING的内在模块。在阅读了更多关于here之后,我不清楚ISO_C_BINDING是否允许我将一些2D数组的信息传递给用C#编写的程序(编译为DLL),调用一些'事件'(类似于函数?),最后从C#获取二维信息数组,然后再继续我在Fortran的业务。

如果熟悉Fortran和C#,请告诉我ISO_C_BINDING是否足以完成任务?我从上面列出的信息中得不到那种感觉。如果有人有一个工作示例,包括在 C# 和Fortran之间传递数组,以及从中调用 C# 函数Fortran,我非常感谢有机会将其视为我可以继续进行的模板。谢谢,埃里克

1 个答案:

答案 0 :(得分:2)

Fortran代码:

function TestPass (floatArray) result (iRes)
implicit none
dll_export :: TestPass ! export function name

integer :: Ires
real, intent (in out) :: floatArray

dimension floatArray(5)

iRes = 0 ! Assign function result

open (5,FILE='output.txt')
write (5, 100) floatArray(3)

floatArray(0) = 0.0
floatArray(1) = 1.1
floatArray(2) = 2.2
floatArray(3) = 3.3
floatArray(4) = 4.4

! correct values are written to file here...
open (5,FILE='output.txt')
write (5, 100) floatArray(3)
100 format(5X,'got here',5X,F3.3)
close (5)
end function

C#代码:

static extern int TestPass (
[MarshalAs(UnmanagedType.LPArray, SizeConst=5,
ArraySubType=UnmanagedType.R4)]
float [] yields);

private void BtnTestClick(object sender, System.EventArgs e)
{
float [] floatArray = new float[5] {9.9F, 9.9F, 9.9F, 9.9F, 9.9F};
TestPass(floatArray);

// floatArray.Length == 0 after the function call

for ( int i = 0; i < floatArray.Length; i++ )
Trace.WriteLine(floatArray[i]);
}

另请参阅此链接:

http://software.intel.com/en-us/articles/calling-fortran-function-or-subroutine-in-dll-from-c-code

您也可以参考一些理论:

http://www.ibiblio.org/pub/languages/fortran/ch2-4.html