2

我已经尝试了 2 天,但无法使其正常工作。

我试图做这个人做的同样的事情:-> 从fortran77 dll返回真实值到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的问题。

4

1 回答 1

0

*$pragma aux ...只有 Open Watcom FORTRAN 77 编译器才能理解辅助编译指示。任何其他编译器都会简单地将它们作为注释忽略。代码示例中的 pragma 的目的是DAA按值传递并将例程符号的外部名称固定为DON(否则 Fortran 编译器可能会将其重新装饰为类似于DON_or的名称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
);

Be aware of possible calling conventions mismatch and symbol decorations/mangling. Check with your Fortran compiler's manual.

于 2012-11-13T12:54:57.610 回答