PInvoke与Windows 7一起使用,但在Windows XP中失败
我有一个使用第三方本机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));
所以我想这个问题是不相关的调用约定。
该问题是由于Windows的限制。 API的静态链接需求来自供应商已知的这一限制。 http://support.microsoft.com/kb/118816解释了Windows中的问题。看起来这已经在Win 7中修复了
您有权访问“cachet.dll”的代码? – leppie 2012-07-18 12:02:49
不,我无权访问源代码。 – Rajeesh 2012-07-18 12:04:47
在这种情况下,请联系供应商。 – leppie 2012-07-18 12:06:00