2012-07-18 111 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

回答

相关问题