C# 非托管DLL不';我不能在Windows7中工作
上周我偶然发现了一个问题,我不知道如何解决它。我已经花了一整天的时间试图独自解决这个问题 我有一个非托管DLL,在Windows XP(32位)系统上的C代码中运行良好。当我尝试在较新的系统(例如Windows7(64位))上运行此C#代码时,它不再工作 这是密码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(); 正如我所说,
[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 }指定可再分发版本。
我这样解决了这个问题:
[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有关?