2012-07-18 66 views
1

我有一個使用第三方本機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)); 

所以我想這個問題是不相關的調用約定。

+0

您有權訪問「cachet.dll」的代碼? – leppie 2012-07-18 12:02:49

+0

不,我無權訪問源代碼。 – Rajeesh 2012-07-18 12:04:47

+1

在這種情況下,請聯繫供應商。 – leppie 2012-07-18 12:06:00

回答

相關問題