.net 4.0 PInvoke适用于Windows 7,但在Windows XP中失败

.net 4.0 PInvoke适用于Windows 7,但在Windows XP中失败,.net-4.0,pinvoke,windows-xp-sp3,.net 4.0,Pinvoke,Windows Xp Sp3,我有一个使用第三方原生C dll的应用程序。在装有.Net 4的Windows 7计算机上,一切都运行良好,但在装有.Net 4的Windows XP(SP3)上,一切都失败了 我在Windows XP计算机上遇到以下异常 未处理的异常:System.AccessViolationException:尝试读取或写入 受保护的内存。这通常表示其他内存已损坏 当我调试时 CacheInteropTest.exe中0x10069e1d处的首次机会异常:0xC0000005:访问冲突读取位置0x0000

我有一个使用第三方原生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();
}
我在WindowsXP(SP3)32位上编译了上述程序,并复制到Windows7机器上运行,它没有给出任何异常。第三方dll与可执行文件位于同一文件夹中

我发现了许多与AccessViolationException相关的问题的回复,尤其是这个
这是一场势均力敌的比赛。 另一个网站在这里有关于PInvoke和内存相关问题的概述 但在这种情况下对我没有帮助

第三方dll是一个数据库内核,提供多线程数据库访问(每个线程维护一个连接)。在API的文档中,提到了DLL必须静态链接,并且在Windows XP上消耗这个DLL的C++应用程序也工作得很好。 我认为问题在于本机dll的实现,但为什么它在Windows7上运行良好呢

有人知道Windows XP会出什么问题吗

供应商提供的本机函数原型为

extern  int  CFPROTOD(CacheEnd,(void));

因此,我想这个问题与调用约定无关。

这个问题是因为Windows的限制。API的静态链接要求来自供应商已知的这一限制。
解释Windows中的问题。看起来这在Win 7中已被修复。该问题是由于Windows中的限制造成的。API的静态链接要求来自供应商已知的这一限制。
解释Windows中的问题。看起来这在Win 7中已经修复了

您可以访问“cachet.dll”的代码吗?不,我没有访问源代码的权限。如果是这样,请与供应商联系。您的Windows XP机器(无法运行代码的机器,而不是编译代码的机器)是64位机器吗?@Rajeesh尝试检查调用约定。另一件事是(即使它不能解决您的问题),您可能希望返回IntPtr而不是int(如果该值表示内存地址)。您可以访问“cachet.dll”的代码?不,我没有访问源代码的权限。在这种情况下,请与供应商联系。您的Windows XP计算机是吗(无法运行代码的,而不是编译代码的)64位计算机?@Rajeesh尝试检查调用约定。另一件事是(即使它不能解决您的问题),您可能希望返回IntPtr而不是int(如果该值表示内存地址)。