我有一個使用第三方本機C DLL的應用程序。一切運行良好的Windows 7機器上的.Net 4,但在Windows XP(SP3)與NET 4失敗。PInvoke與Windows 7一起使用,但在Windows XP中失敗
我在Windows XP機器上得到以下例外。
未處理的異常:System.AccessViolationException:試圖讀取或寫入 受保護的內存。這通常表明其他內存已損壞。
當我調試,
在0x10069e1d在CacheInteropTest.exe第一次機會異常:0000005:訪問衝突讀取位置00000000。
這是我簡單的測試應用程序代碼:
public unsafe class Program
{
[STAThread]
static void Main(string[] args)
{
var status = CacheEnd();
Console.ReadKey(true);
}
[SuppressUnmanagedCodeSecurity]
[DllImport("cachet.dll", EntryPoint = "#24", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
internal extern static int CacheEnd();
}
我編寫在Windows XP(SP3),32位和複製到Windows 7計算機並運行上述程序,它沒有給出任何例外。第三方dll與可執行文件位於同一個文件夾中。
我發現很多有關AccessViolationException的問題的回覆,特別是這個
AccessViolationException in P/Invoke call是一個近似匹配。 另一個網站有關於PInvoke和內存相關問題的概述 http://dotnetdebug.net/2006/04/17/pinvoke-and-memory-related-issues/但在這種情況下幫不了我。
第三方DLL是一個數據庫內核,並提供多線程數據庫訪問(每個線程維護一個連接)。在API的文檔中提到,dll必須是靜態鏈接的,並且在Windows XP上使用此dll的C++應用程序運行良好。
我認爲問題在於本機DLL的實現,但爲什麼它在Windows 7上運行良好?
任何人都有什麼想法可以在Windows XP上出錯?由供應商提供
本地函數原型類型是
extern int CFPROTOD(CacheEnd,(void));
所以我想這個問題是不相關的調用約定。
您有權訪問「cachet.dll」的代碼? – leppie 2012-07-18 12:02:49
不,我無權訪問源代碼。 – Rajeesh 2012-07-18 12:04:47
在這種情況下,請聯繫供應商。 – leppie 2012-07-18 12:06:00