我有一个使用第三方本机 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));
所以我猜这个问题与调用约定无关。