Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 托管/非托管代码无法在某些计算机上启动_Visual Studio 2008_Interop_C++ Cli - Fatal编程技术网

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。我会调查的。