我继承了一个用 C 语言编写的 dll,我可以从 C# 中的 Windows 应用程序(Framework 2.0)访问它。最近一些机器已经升级到 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);
如果我将 C dll 编译为 64 位 dll,同时保留函数原样,我需要对 C# 中的函数进行哪些更改?
我会假设我必须将 I4s 更改为 I8s,但是我会用什么类型替换 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,
还是我在叫错树?