我繼承了一個用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來實現它。 –