C#のWindowsアプリケーション(Framework 2.0)からアクセスするCで記述されたdllを継承しました。最近、一部のマシンが64ビットWindows 7にアップグレードされ、dllがそれらのマシンで正しい値を返さなくなりました。これは、C関数に64ビットが期待されるパラメーター型があるためだと思います。
これがC関数のシグネチャです
int doFlightCalc_S(double LatA,
double LonA,
double LatB,
double LonB,
int month,
int aircraftCd,
int nbrPsgrs,
int taxiInTm,
int taxiOutTm,
int fuelStopTime,
int *results)
これがC#から関数にアクセスする定義です
[DllImport("doFlightCalc.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int doFlightCalc_S(
[MarshalAs(UnmanagedType.R8)] double latA,
[MarshalAs(UnmanagedType.R8)] double lonA,
[MarshalAs(UnmanagedType.R8)] double latB,
[MarshalAs(UnmanagedType.R8)] double lonB,
[MarshalAs(UnmanagedType.I4)] int month,
[MarshalAs(UnmanagedType.I4)] int aircraftCd,
[MarshalAs(UnmanagedType.I4)] int nbrPsgrs,
[MarshalAs(UnmanagedType.I4)] int taxiInTm,
[MarshalAs(UnmanagedType.I4)] int taxiOutTm,
[MarshalAs(UnmanagedType.I4)] int fuelStopTime,
[MarshalAs(UnmanagedType.LPArray)] [Out] int[] results);
関数をそのままにしてCdllを64ビットdllとしてコンパイルする場合、C#の関数にどのような変更を加える必要がありますか?
I4をI8に変更する必要があると思いますが、intとdoubleをどのタイプに置き換えますか?次のようになりますか:
[MarshalAs(UnmanagedType.R8)] double lonB,
[MarshalAs(UnmanagedType.I4)] int month,
次のように変更されます:
[MarshalAs(UnmanagedType.R8)] (what would go here?) lonB,
[MarshalAs(UnmanagedType.I8)] long (is long correct here?) month,
それとも私は間違った木を吠えていますか?