非托管DLL在Windows 7中不起作用

时间:2014-03-10 06:33:15

标签: c# .net windows dll dllimport

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

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

这是代码

[DllImport("MyTest.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern String DoSomething();

正如我所说,这在我的Windows XP系统上运行正常,但在我的Windows 7系统上无效。当我尝试在Windows 7系统上运行此代码时,我得到以下异常(翻译成英文)

  

DLL“MyTest.dll”:复发太深,Stackoverflow。 (无法加载HRESULT的异常:0x800703E9)。

我猜这个问题是因为:

Load 32bit DLL library in 64bit application

How to call win32 dll in windows 7

我只是不确定,因为当我与DLLImport一起搜索我的异常时,我找不到任何东西。

如果这确实是问题,最佳解决方案是什么?

2 个答案:

答案 0 :(得分:0)

您可以查看:

  1. dependency walker的非托管dll依赖项。可能缺少c ++可再发行组件。查找MSVCR {xxx} .dll,其中{xxx}指定可再发行的版本。
  2. 托管应用程序的编译设置,最终加载非托管dll(任何CPU,x86或x64)。可能是托管应用程序设置为任何CPU但非托管应用程序是x86,因此非托管DLL的加载失败。
  3. 在Windows XP和Windows 7上安装了.NET框架。问题可能是在.NET框架上应用了不同的补丁,但这是最不可能成为您的问题。

答案 1 :(得分:0)

我解决了这个问题:

[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#-Code或C ++ - Code来解决。

有关此问题的详细信息,请访问: http://blogs.msdn.com/b/asiatech/archive/2009/12/24/net-application-may-crash-on-windows-2008-when-calling-function-from-native-c-dll.aspx