上周我偶然发现了一个问题,我不知道如何解决它。我已经花了一整天时间试图单独解决它。
我有一个非托管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一起搜索我的异常时,我找不到任何东西。
如果这确实是问题,最佳解决方案是什么?
答案 0 :(得分:0)
您可以查看:
答案 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