1

我有一个使用第三方本机 C dll 的应用程序。在具有 .Net 4 的 Windows 7 机器上一切正常,但在具有 .Net 4 的 Windows XP (SP3) 上失败。

我在 Windows XP 机器上得到以下异常。

未处理的异常:System.AccessViolationException:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

当我调试时,

CacheInteropTest.exe 中 0x10069e1d 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。

这是我的简化测试应用程序代码:

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 相关的问题的回复,尤其是
P/Invoke 调用中的这个 AccessViolationException 非常匹配。另一个站点在这里http://dotnetdebug.ne ​​t/2006/04/17/pinvoke-and-memory-related-issues/ 对 PInvoke 和内存相关问题进行了概述, 但在这种情况下对我没有帮助。

第三方 dll 是一个数据库内核,提供多线程数据库访问(每个线程保持一个连接)。在 API 的文档中提到该 dll 必须是静态链接的,并且在 Windows XP 上使用该 dll 的 C++ 应用程序也可以正常工作。

我认为问题在于本机 dll 的实现,但为什么它在 Windows 7 上运行良好?

任何人都知道在 Windows XP 上可能会出现什么问题?

供应商提供的原生函数原型是

extern  int  CFPROTOD(CacheEnd,(void));

所以我猜这个问题与调用约定无关。

4

1 回答 1

1

问题是由于 Windows 中的限制。API 的静态链接要求来自供应商已经知道的这个限制。 http://support.microsoft.com/kb/118816解释了 Windows 中的问题。看起来这已在 Win 7 中修复

于 2012-07-20T09:21:11.667 回答