C# 非托管DLL不';我不能在Windows7中工作

C# 非托管DLL不';我不能在Windows7中工作,c#,.net,windows,dll,dllimport,C#,.net,Windows,Dll,Dllimport,上周我偶然发现了一个问题,我不知道如何解决它。我已经花了一整天的时间试图独自解决这个问题 我有一个非托管DLL,在Windows XP(32位)系统上的C代码中运行良好。当我尝试在较新的系统(例如Windows7(64位))上运行此C#代码时,它不再工作 这是密码 [DllImport("MyTest.dll")] [return: MarshalAs(UnmanagedType.LPStr)] public static extern String DoSomething(); 正如我所说,

上周我偶然发现了一个问题,我不知道如何解决它。我已经花了一整天的时间试图独自解决这个问题

我有一个非托管DLL,在Windows XP(32位)系统上的C代码中运行良好。当我尝试在较新的系统(例如Windows7(64位))上运行此C#代码时,它不再工作

这是密码

[DllImport("MyTest.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern String DoSomething();
正如我所说,这在我的Windows XP系统上运行良好,但在我的Windows 7系统上不起作用。当我尝试在我的Windows 7系统上运行此代码时,我遇到以下异常(翻译成英语)

DLL“MyTest.DLL”:重复太深,堆栈溢出。(HRESULT异常:0x800703E9)无法加载

我猜问题在于:

我只是不确定,因为当我结合DLLImport搜索我的异常时,我找不到任何东西

如果这确实是一个问题,那么最好的解决方案是什么?

您可以检查:

< LI>与未管理的DLL依赖项相关。可能存在缺少C++可重分配的。查找MSVCR{xxx }.dll,其中{xxx }指定可再分发版本。
  • 最终加载非托管dll(任何CPU、x86或x64)的托管应用程序的编译设置。可能是托管应用程序设置为任何CPU,但非托管应用程序为x86,因此加载非托管dll失败
  • 在windows xp和windows 7上安装了.NET Framework。问题可能是在.NET Framework上应用了不同的修补程序,但这是您最不可能遇到的问题

  • 我这样解决了这个问题:

    [DllImport("MyTest.dll", CharSet = CharSet.Ansi)]
    private static extern IntPtr DoSomething();
    public static string Do_Something()
    {
       IntPtr tempPointer = DoSomething();
       string tempSomething = Marshal.PtrToStringAnsi(tempPointer);
       return tempSomething ;
    }
    
    问题与损坏的堆有关。在较新版本的Windows中,损坏堆的处理方式不同,因此我的应用程序崩溃。可以通过更改C#-代码或C++代码来解决

    有关此问题的详细信息可在此处找到:

    程序集是否引用自身?即,程序集的名称是否为
    MyTest.dll
    ?不,程序集的名称不同。如果名称相同,我认为代码也无法在Windows XP上运行。请尝试将您的C#项目编译为x86,而不是任何CPU。1.我使用了依赖项walker,对MSVCR{xxx}没有依赖项.dll。2.我只能将其编译为AnyCPU,但我试图在Windows Server 2008(32位)系统上运行它,但它在那里也不起作用。你能粘贴你试图封送的方法的C定义吗?很遗憾,我不能这样做,因为我没有访问dll源的权限。“封送”在Windows XP和Windows Server 2003上运行良好,因此我认为问题不在于C代码或C代码。我认为这与更新操作系统的更改有关。我尝试在Windows 7 32位操作系统上运行该应用程序,但仍然不起作用。可能与内核从5.x更改为6.x有关?