【问题标题】:Return values from FORTRAN 77 Code to C#从 FORTRAN 77 代码返回值到 C#
【发布时间】:2012-11-12 21:24:49
【问题描述】:

我已经尝试了 2 天,但无法成功。

我试图做同样的事情这个家伙做了:-> returning real values from fortran77 dll to c#

我所做的一切都和他一模一样。甚至在同一个编译器中使用相同的参数编译。

但我收到“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”错误。

需要帮助!

这是我的 C# 代码:

 [DllImport("Lks.dll",
        CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall)]
    public static extern void DON(
        [MarshalAs(UnmanagedType.R8)] double DAA,
        [MarshalAs(UnmanagedType.R8)] double DBB,
        [MarshalAs(UnmanagedType.R8)] double DCC
        );

    static unsafe void Main(string[] args)
    {
        //double TIME = 100.0;
        double DAA = 5.5;
        double DBB = 7;
        double DCC = 9;
        //START( ENERIN, VAL1);
        DON(DAA, DBB, DCC);

        Console.Write("val1 = " + DAA);
        Console.Write("val2 = " + DCC);
        Debug.WriteLine("VAR = " + DBB.ToString());
        Console.Write("Press any key to exit");
        Console.ReadKey(false);
    }

这是我的 FORTRAN 77 代码:

*$pragma aux DON "DON" export parm(value*8, reference, reference)


  SUBROUTINE DON(DAA,DBB,DCC)
  REAL*8, DAA,DBB,DCC
  DBB=DAA+1
  DCC=DBB+1 
  RETURN
  END

在我看来,一切都一样。所以我想可能是VS2010的问题。

【问题讨论】:

  • 你的 fortran 编译器是...? (可能的原因是按值传递(C#)/按引用传递(Fortran)不匹配)
  • 这个*$pragma aux ...只有Open Watcom F77编译器才能理解。

标签: c# visual-studio-2010 dll fortran return-value


【解决方案1】:

*$pragma aux ... 辅助编译指示只有 Open Watcom FORTRAN 77 编译器才能理解。任何其他编译器都会简单地将它们作为 cmets 忽略。代码示例中 pragma 的目的是使 DAA 传递值并将例程符号的外部名称固定为 DON (否则 Fortran 编译器可能会将其重新装饰为类似于 DON_don__)。其他两个参数仍然是按引用传递。您问题中的 P/Invoke 接口将它们全部指定为按值传递。您需要添加ref 关键字:

[DllImport("Lks.dll",
           CharSet = CharSet.Auto,
           CallingConvention = CallingConvention.StdCall)]
public static extern void DON(
    [MarshalAs(UnmanagedType.R8)] double DAA,
    [MarshalAs(UnmanagedType.R8)] ref double DBB,
    [MarshalAs(UnmanagedType.R8)] ref double DCC
);

如果您使用任何其他不理解 OW 编译指示的 Fortran 编译器,那么所有参数都将通过引用传递,因此您需要将 ref 应用于所有参数:

[DllImport("Lks.dll",
           CharSet = CharSet.Auto,
           CallingConvention = CallingConvention.StdCall)]
public static extern void DON(
    [MarshalAs(UnmanagedType.R8)] ref double DAA,
    [MarshalAs(UnmanagedType.R8)] ref double DBB,
    [MarshalAs(UnmanagedType.R8)] ref double DCC
);

注意可能的调用约定不匹配和符号修饰/修饰。请查阅您的 Fortran 编译器手册。

【讨论】:

  • @Roiw,所以您真的在使用 Open Watcom 编译器套件?为什么不为 Win32 使用更现代的东西,例如 gfortran
  • 是的!我正在使用 Open Watcom。我尝试了 gfortran,但它没有 IDE,而且看起来更难学习。这就是我选择 Open Watcom 的原因。
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多