我没有在Stack Overflow上找到任何关于从Fortran调用C#的帖子(我使用的是安装了Intel Visual Fortran的Visual Studio 2010)。但是,有一个(非常)有限的帖子[1,2,3]讨论了从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,我非常感谢有机会将其视为我可以继续进行的模板。谢谢,埃里克
答案 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
您也可以参考一些理论: