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 コンパイラによってのみ理解されます。他のコンパイラは、それらをコメントとして単に無視します。コード サンプルのプラグマの目的は、DAA値渡しを行い、ルーチン シンボルの外部名を に修正することですDON(そうしないと、Fortran コンパイラがそれをDON_またはのようなものに再装飾する可能性がありdon__ます)。他の 2 つの引数は参照渡しのままです。あなたの質問の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 コンパイラのマニュアルで確認してください。

于 2012-11-13T12:54:57.610 に答える