在Windows 2008上运行的Windows 7上构建:无法初始化应用程序0xc0000005。在C#库上使用对Wrapper的引用

时间:2011-04-29 08:11:05

标签: visual-studio-2010 windows-7 windows-server-2008 windows-server-2003 windows-server-2008-r2

我正在VS2010和Windows 7(x86)下构建一个C ++ / MFC(我知道它是一项旧技术,但需要维护它)。在Windows 2008 R2(x64)下运行应用程序正常,应用程序启动成功。
但是当我尝试在Windows 2008(x86)或Windows Server 2003下运行应用程序失败时,我在两个系统上都遇到了同样的错误:“应用程序无法正确初始化(0xc0000005)。单击确定关闭应用程序“。

由于应用程序是在x86系统下构建的,但只能在构建的系统(win7 x86)和x64系统上运行,因此它看起来非常棒。 其次,异常代码 0xc0000005 是什么意思?
任何提示都会找到使应用程序不可启动的x86系统中缺少的内容?

这是来自WinDbg的日志:

Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: "C:\Documents and Settings\Administrator\Desktop\BINTest\C****.exe"
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is: 
ModLoad: 00400000 00581000   C*******.exe
ModLoad: 7c800000 7c8c2000   ntdll.dll
ModLoad: 77e40000 77f43000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 77b90000 77b98000   C:\WINDOWS\system32\VERSION.dll
ModLoad: 77ba0000 77bfa000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 10000000 1001a000   C:\Documents and Settings\Administrator\Desktop\BINTest\S*****************.dll
ModLoad: 79000000 79046000   C:\WINDOWS\system32\mscoree.dll
ModLoad: 78aa0000 78b5d000   C:\Documents and Settings\Administrator\Desktop\BINTest\MSVCR100.dll
ModLoad: 78050000 780b9000   C:\Documents and Settings\Administrator\Desktop\BINTest\MSVCP100.dll
ModLoad: 003a0000 003c0000   C:\Documents and Settings\Administrator\Desktop\BINTest\R*********.dll
ModLoad: 003d0000 003d8000   C:\Documents and Settings\Administrator\Desktop\BINTest\Ch*****.dll
ModLoad: 78520000 785c3000   C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_D08D0375\MSVCR90.dll
ModLoad: 78b60000 78f8c000   C:\Documents and Settings\Administrator\Desktop\BINTest\mfc100.dll
ModLoad: 77380000 77412000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c00000 77c49000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 77f50000 77fec000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77c50000 77cef000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77da0000 77df2000   C:\WINDOWS\system32\SHLWAPI.dll
ModLoad: 77530000 775c7000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.2778_x-ww_497C098C\COMCTL32.dll
ModLoad: 76280000 76285000   C:\WINDOWS\system32\MSIMG32.dll
ModLoad: 7c8d0000 7d0d4000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77670000 777a4000   C:\WINDOWS\system32\ole32.dll
ModLoad: 77d00000 77d8c000   C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 71bb0000 71bb9000   C:\WINDOWS\system32\WSOCK32.dll
ModLoad: 71c00000 71c17000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71bf0000 71bf8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 6d580000 6d628000   C:\WINDOWS\system32\dbghelp.dll
ModLoad: 76cf0000 76d0a000   C:\WINDOWS\system32\IPHLPAPI.DLL
ModLoad: 76b70000 76b7b000   C:\WINDOWS\system32\PSAPI.DLL
(87c.135c): Break instruction exception - code 80000003 (first chance)
eax=76c00000 ebx=7ffda000 ecx=00000003 edx=00000008 esi=7c88be14 edi=00151f38
eip=7c822577 esp=0012fb70 ebp=0012fcb4 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
*** WARNING: symbols timestamp is wrong 0x49901641 0x45d70ad8 for ntdll.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
ntdll!RtlMultiByteToUnicodeN+0x6002:
7c822577 cc              int     3
0:000> g
(87c.135c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=77fc2324 ecx=fffffffc edx=00000000 esi=77fc2320 edi=00000004
eip=7c8396f0 esp=0012f030 ebp=0012f058 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
ntdll!strnicmp+0x22b:
7c8396f0 8b5014          mov     edx,dword ptr [eax+14h] ds:0023:00000014=????????
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\ADVAPI32.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\mscoree.dll - 



* 下一步:删除项目中的依赖项。
我的项目依赖于另一个c ++项目(R
* * .dll),它是C#库的包装器。当删除此依赖项时,我的程序突然起作用(至少它正常启动)。
如何链接这个DLL(包装器和c#)?
它是否表现出来? 任何想法?
这是应用程序的清单

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity 
    version="1.0.0.0" 
    processorArchitecture="X86" 
    name="Microsoft.Windows.C****"
    type="win32" 
/> 
<description></description> 
<dependency> 
    <dependentAssembly> 
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="X86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly> 
</dependency> 
</assembly>

1 个答案:

答案 0 :(得分:0)

似乎问题的根本原因是两个版本的C ++运行时库之间存在冲突。

您的应用程序是使用Visual Studio 2010编译的,因此它需要C ++运行时的 10 版本,但它依赖于另一个加载.NET CLR版本2的C ++项目。反过来,该版本的CLR需要C ++运行时的 9 版本。由于给定进程只能加载一个版本的运行时,因此会产生混乱。

简单的方法是使用Visual Studio 2008构建应用程序,或者修改依赖项目,使其面向.NET CLR的第4版。这样,两个模块都会同意要加载的C ++运行时版本。

困难的方法是将应用程序拆分为两个进程:一个加载依赖项目,另一个包含适当的应用程序,并使用某种形式的IPC在它们之间进行通信。这样,每个进程都可以加载自己的C ++运行时版本。