我继承了一个用C语言编写的dll,可以从C#中的windows应用程序(Framework 2.0)访问。最近有些机器已升级到64位Windows 7,并且dll不再在这些机器上返回正确的值。我相信这是因为C函数具有预期为64位的参数类型。Managed Type equivalent [MarshalAs(UnmanagedType.I8)]
这里的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)
这里的Signature的,虽然离开从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,
还是我找错了树?
不知道更多的细节,我想你可能会过早跳到无根据的结论。例如,有没有人*重新编译这个C .dll?作为一个64位的二进制文件?你知道吗?这是事实吗? – paulsm4
不,那不是。你也不会意外地创建了该DLL的64位版本。使用调试器。 –
我通过将可执行文件的生成平台从AnyCPU更改为x86来实现它。 –