繁体   English   中英

从 C# 调用 FORTRAN dll 并将值分配给结构数组

[英]Calling FORTRAN dll from C# and assigning values to array of structures

我可以将C#结构传递给FORTRAN就好了。 我什至可以将C# FORTRANTYPE()数组传递。 当我尝试将值返回到C#时,我遇到了麻烦。 这是一个例子:

fortran dll 是:

MODULE TESTING

   TYPE VALUEREF
     INTEGER*4 :: A
   ENDTYPE VALUEREF

CONTAINS

   SUBROUTINE TEST_REF(T,N)
   !DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF
   !DEC$ ATTRIBUTES ALIAS:'TEST_REF' :: TEST_REF
   !DEC$ ATTRIBUTES VALUE :: N
   IMPLICIT NONE
     INTEGER*4 :: A,I,N   
     TYPE(VALUEREF) :: T(N)      
     A = 100
     DO I=1,N
        T(I)%A = A + I
     END DO

   END SUBROUTINE
END MODULE

C#调用 function 期望结果是:

[StructLayout(LayoutKind.Sequential)]
public struct ValueRef
{
    public int a;
}

[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef[] t, int n);

void Main()
{
    ValueRef[] T = new ValueRef[4];
    for (int i = 0; i < T.Length; i++)
    {
        T[i].a = i;
    }
    Console.WriteLine("Initialize");
    for (int i = 0; i < T.Length; i++)
    {
        Console.WriteLine("  A={0}", T[i].a);
    }
    Console.WriteLine("Call Fortran");
    TEST_REF(T, T.Length);
    for (int i = 0; i < T.Length; i++)
    {
        Console.WriteLine("  A={0}", T[i].a);
    }
}

结果:

Initialize
  A=0
  A=1
  A=2
  A=3
Call Fortran
  A=0
  A=1
  A=2
  A=3

通过 FORTRAN 代码进行调试,我看到初始值从C#传递到FORTRAN就好了。 这些值被新值覆盖,并且控制权被传递回C# ,其中旧值仍包含在ValueRef实例中。

为什么我可以以类似的方式传递和返回一个floatint数组,就好了。 我可以使用ref关键字传递和返回奇异结构,我可以传递但不能返回和数组struct

附言 我正在使用 Compaq Visual Fortran 6.5 & .NET 3.5
PS2 我很感激对此的任何评论/想法。 我的项目完成了 95%,现在我遇到了这个问题。 这个项目的重点是尽可能地使用结构来减少传递给函数的#of arguments 并保留 OOP 设计的某些方面。

我过去使用指针而不是数组来完成此操作。 我认为您的结构正在为 P/Invoke 调用复制:

[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef* t, int n);

在调用该方法之前,您需要固定您的数组。

fixed (ValueRef* pointer = t)
{
  TEST_REF(pointer, n);
}

编辑:根据评论,解决方案是将外部声明为

[DllImport("mathlib.dll")]
static extern void TEST_REF([Out] ValueRef[] t, int n);

这是有关 arrays 编组的MSDN参考,以及它们如何默认[In]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM