非托管DLL不能在Windows 7中工作
本文关键字:Windows 工作 不能 DLL | 更新日期: 2023-09-27 17:49:26
上周我偶然发现了一个问题,我不知道如何解决它。我已经花了一整天的时间试图独自解决这个问题。
我有一个非托管DLL,在我的c#代码在Windows XP(32位)系统上工作得很好。当我尝试在较新的系统(例如Windows 7(64位))上运行这段c#代码时,它不再工作了。
代码
[DllImport("MyTest.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern String DoSomething();
正如我所说的,这在我的Windows XP系统上工作得很好,但在我的Windows 7系统上不起作用。当我尝试在Windows 7系统上运行此代码时,我得到以下异常(翻译成英文)
DLL "MyTest.dll":复发太深,Stackoverflow。(Exception from HRESULT: 0x800703E9) can not loaded.
我猜问题是由于这个:
在64位应用程序中加载32位DLL库
如何在windows 7中调用win32 dll
我只是不确定,因为当我搜索我的异常与DLLImport相结合时,我找不到任何东西。
如果这真的是问题,最好的解决方案是什么?
你可以检查:
- 非托管dll依赖项。可能缺少c++可重新分发。查找MSVCR{xxx}.dll,其中{xxx}指定可重新分发的版本。
- 最终加载非托管dll的托管应用程序的编译设置(任何CPU, x86或x64)。可能是托管应用程序设置为任意CPU,但非托管应用程序是x86,因此加载非托管dll失败。
- 在windows xp和windows 7上安装。net框架。问题可能是不同的补丁应用于。net框架,但这是最不可能是你的问题。
我这样解决了这个问题:
[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++代码来解决。
关于这个问题的详细信息可以在这里找到:http://blogs.msdn.com/b/asiatech/archive/2009/12/24/net -应用程序-可能崩溃- windows - 2008 -调用函数时——从本地- c - dll.aspx