Visual studio 2008 托管/非托管代码无法在某些计算机上启动
Visual studio 2008 托管/非托管代码无法在某些计算机上启动,visual-studio-2008,interop,c++-cli,Visual Studio 2008,Interop,C++ Cli,我假设读者熟悉混合托管/非托管代码系统以及为什么需要它们。这个问题将不讨论这个问题,而是讨论使用VisualStudio2008编译器和链接器控件构建这样一个系统的机制
背景
首先,去掉糠秕。我的调查结果如下:
初始C++项目是基于MFC的
共享dll中的MFC
无clr
C++异常/EHa
多线程调试/MD
这一切都在VisualStudio2008下的所有开发人员工作站上正确构建和运行
现在,我们在项目中加入了第三方C#.NET3.5SP1库。这个库是用一个本地C++桥构建的互操作。原始
我假设读者熟悉混合托管/非托管代码系统以及为什么需要它们。这个问题将不讨论这个问题,而是讨论使用VisualStudio2008编译器和链接器控件构建这样一个系统的机制
背景
首先,去掉糠秕。我的调查结果如下:
- 初始C++项目是基于MFC的
- 共享dll中的MFC
- 无clr
- C++异常/EHa
- 多线程调试/MD
这一切都在VisualStudio2008下的所有开发人员工作站上正确构建和运行
现在,我们在项目中加入了第三方C#.NET3.5SP1库。这个库是用一个本地C++桥构建的互操作。原始C++项目引用这个新库的导入文件作为链接器输入的一部分。所有这些都是非常标准的东西,在论坛上都有很好的参考
第三方库的构建如下所示:
- 公共语言运行时支持/clr
- C++异常/EHa
- 多线程调试/MD
问题
在我们的八个开发人员工作站上,调试(和发布)正确构建了所有构建和启动。只有一个开发人员工作站在启动时出现以下错误:
Windows已在blah.exe中触发断点。
这可能是由于堆中的损坏,这表明blah.exe或其加载的任何DLL中存在错误
这一切都发生在应用程序启动之前,很难追踪到。我使用/尝试/删除了以下内容:
- 配置不正确的工作站。尽管如此,没有两个工作站是完全相同的。是的,它们都有相同的工具和操作系统(Windows-7),但除此之外,它们的配置略有不同
- 依赖步行者
- 过程分析工具(ProcMon)
- 静态库构建彼此不一致,导致堆不匹配。编译器开关/MD针对两个代码基对齐。也就是说,CLR的堆总是不同于本机代码的堆
解决方案
<> >如果我现在只需切换C++构建的/CLR,所有问题就会消失。为什么?我怀疑这两个代码空间现在将使用相同的堆。当然,不同的运行时环境是混合模式的全部内容?这不是首选的解决方案
最新信息
Visual Studio调试窗口报告以下内容:
*“blah.exe”中发生访问冲突:
747220A3处的指令试图读取无效地址,
00000B90
- 输入.exr 00032690作为异常记录
- 输入.cxr 000326AC作为上下文
- 然后使用kb获取故障堆栈
中0x747220a3(MSCTF.dll)处的首次机会异常
blah.exe:0xC0000005:访问冲突读取位置
0x00000b90
附录
C++项目编译器选项(调试生成):
/Od/D“WIN32”/D“\u WINDOWS”/D“\u调试”
/D“_VC80_UPGRADE=0x0710”/D“_AFXDLL”/D“_MBCS”/FD/EHa/MDd
/Yu“stdafx.h”/Fp“Debug\blah.pch”/Fo“Debug”
/Fd“Debug\vc90.pdb”/W3/WX/nologo/c/Zi/clr/TP/wd4793/wd4996
/错误报告:提示
C++项目链接器选项(调试生成):
/输出:“..\Debug\blah.exe”/INCREMENTAL/NOLOGO/MANIFEST
/清单文件:“Debug\blah.exe.intermediate.manifest”
/声明:“level='asInvoker'uiAccess='false'”/DEBUG
/ASSEMBLYDEBUG/PDB:“blah.PDB”/SUBSYSTEM:WINDOWS/largeaddressware
/DYNAMICBASE:NO/已修复:NO/机器:X86/错误报告:提示符
iphlapi.lib UxTheme.lib../Libraries/Bridge.lib
C#.NET库编译器选项(调试生成):
/Od/D“WIN32”/D“_DEBUG”/D“_windl”/D“_UNICODE”/D“UNICODE”/FD
/EHa/MDd/Yu“stdafx.h”/Fp“Debug\Bridge.pch”/Fo“Debug”
/Fd“Debug\vc90.pdb”/W3/nologo/c/Zi/clr/TP/errorReport:prompt
/FU“c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll”/FU
“c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll”/FU
“c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.XML.dll”/FU
“Library.dll”
C#.NET库链接器选项(调试生成):
/输出:“Bridge.dll”/INCREMENTAL/NOLOGO/dll/MANIFEST
/MANIFESTFILE:“Debug\Bridge.dll.intermediate.manifest”
/声明:“level='asInvoker'uiAccess='false'”/DEBUG
/ASSEMBLYDEBUG/PDB:“Bridge.PDB”/DYNAMICBASE/FIXED:No/NXCOMPAT
/计算机:X86/ERRORREPORT:提示符
通过简单地向有问题的DLL应用延迟加载,问题得到了解决。我只能假设这将它从启动负载中移除,从而避免启动冲突
DLL将在以后首次使用该功能时加载。它在所有工作站上都能正确运行。当Windows堆管理器检测到堆已损坏时,会触发此诊断。这当然是C++代码中非常常见的错误。如果它重复得很差,那么就要考虑代码没有完成损坏的可能性,但是在该机器上的进程中注入了一些其他DLL。比较DLL加载通知。非常感谢Hans。我会调查的。