从Fortran调用C#

从Fortran调用C#,c#,fortran,fortran-iso-c-binding,C#,Fortran,Fortran Iso C Binding,我还没有发现任何关于堆栈溢出的帖子讨论从Fortran调用C#(我正在使用Visual Studio 2010并安装了Intel Visual Fortran)。然而,讨论从fortran调用C/C++的文章(非常)有限 在这些帖子的一个回复中,有人建议从FORTRAN调用C++比调用C更难,这就引起了我对C可能更棘手的怀疑。在C/C++ +C中缺乏基础,我想知道C/C++的程序是否适用于C?p> 我注意到这些帖子的一个共同点是,需要一个名为ISO_C_BINDING的内在模块。在阅读了更多关于

我还没有发现任何关于堆栈溢出的帖子讨论从Fortran调用C#(我正在使用Visual Studio 2010并安装了Intel Visual Fortran)。然而,讨论从fortran调用C/C++的文章(非常)有限

在这些帖子的一个回复中,有人建议从FORTRAN调用C++比调用C更难,这就引起了我对C可能更棘手的怀疑。在C/C++ +C中缺乏基础,我想知道C/C++的程序是否适用于C?p> 我注意到这些帖子的一个共同点是,需要一个名为ISO_C_BINDING的内在模块。在阅读了更多关于它的内容后,我不清楚ISO#C#绑定是否允许我将两个2D数组值的信息传递给用C#编写的程序(编译为DLL),调用一些“事件”(类似于函数),最后从C#返回2D数组信息,在继续我的Fortran业务之前


如果您对Fortran和C#都熟悉,您能告诉我ISO#U C#U绑定是否足以完成这项任务吗?我没有从上面列出的信息中得到那种感觉。如果任何人有一个工作示例,其中包括在C#和Fortran之间传递数组,以及从Fortran调用C#函数,我将非常感谢有机会将其作为一个模板进行查看,以了解如何进行操作。谢谢,Eric

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
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]);
}
C#代码:

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
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]);
}
static extern int TestPass(
[Marshallas(UnmanagedType.LPArray,SizeConst=5,
ArraySubType=UnmanagedType.R4)]
浮动[]收益率);
私有void BtnTestClick(对象发送方,System.EventArgs e)
{
float[]floatArray=新的float[5]{9.9F,9.9F,9.9F,9.9F,9.9F};
TestPass(floatArray);
//函数调用后floatArray.Length==0
for(int i=0;i
另请参考此链接:

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
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]);
}

你也可以参考一些关于它的理论:

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
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]);
}

您可能想用C胶水包装Fortran代码。然后你的
C#
代码将调用C代码,这将调用你的FortranHi用户2256085,我问的是完全相同的问题,像你一样,我很难找到关于它的很多内容。当我真的找到了一些东西,比如下面的答案,它似乎总是在错误的方向上,即从Fortran到C#,而不是从C#到Fortran。在你发布这篇文章的两年里,你发现了什么新的东西吗?第57页,我终于找到了一个有效的例子。如果有一种方法可以直接(通过电子邮件)继续这段对话,那就让我们这样做吧,尽管这可能需要我们中的一个人在这里发布直接的联系信息,而你可能不想这样做(我不想)。你好,自由职业者,天哪,我不得不回去重新阅读我原来的帖子,因为你提供的例子让我觉得我问的与我的意图完全相反。除非我错过了显而易见的,这是完全可能的,否则我想找一个例子,其中C#是从Fortran调用的。也就是说,您(或其他相关人员)是否有一个使用C#编写的函数的fortran代码示例,而不是如上所示的其他方法?