托管/非托管代码无法在某些计算机上启动

时间:2012-07-16 11:22:02

标签: visual-studio-2008 interop c++-cli

我假设读者熟悉混合托管/非托管代码系统以及为什么需要它们。这个问题不会涉及到这个问题,而是使用Visual Studio 2008编译器和链接器控件构建这样一个系统的机制。

背景

首先,摆脱糠..我的调查研究如下:

  • 初始C ++项目是基于MFC的
  • 共享dll中的MFC
  • 没有clr
  • C ++ Exceptions / EHa
  • 多线程调试/ MD

这一切都在Visual Studio 2008下的所有开发人员工作站上构建和运行。

我们现在在项目中包含第三方C#.NET3.5 SP1库。该库是使用本机C ++桥为互操作构建的。原始C ++项目引用此新库的导入文件作为其链接器输入的一部分。所有非常标准的东西,并在论坛上很好地引用。

第三方库的构建如下:

  • 公共语言运行时支持/ clr
  • C ++ Exceptions / EHa
  • 多线程调试/ MD

问题

在我们的八个开发人员工作站上,Debug(和Release)构建所有构建并正确启动。只有一个开发人员工作站在启动时收到以下错误:

  

Windows在blah.exe中触发了断点   这可能是由于堆中的损坏,这表示blah.exe或其加载的任何DLL中存在错误。

这在应用程序启动之前发生,并且证明难以追踪。我已经使用过/试过/删除了以下内容:

  • 配置不正确的工作站。在说,没有两个工作站是完全相同的。是的,它们都具有相同的工具和操作系统(Windows-7),但除此之外,它们的配置略有不同。
  • Depedency Walker
  • 流程分析工具(ProcMon)
  • 静态库构建不一致,导致堆不匹配。编译器开关/ MD对齐两个代码库。这样说,CLR的堆总是与本机代码的堆不同。

解决方案

如果我现在只是为C ++构建打开 / clr ,所有问题都会消失。为什么?我怀疑这两个代码空间现在都使用相同的堆。当然,不同的运行时环境是混合模式的全部内容吗?这不是首选解决方案。

最新信息

Visual Studio调试窗口报告以下内容:

  

* " blah.exe"中发生了访问冲突:

     

747220A3的指令试图从无效地址读取,   00000B90

     
      
  • 输入.exr 00032690作为例外记录
  •   
  • 输入.cxr 000326AC作为上下文
  •   
  • 然后kb获得故障堆栈
  •   
     

在0x747220a3(MSCTF.dll)中的第一次机会异常   blah.exe:0xC0000005:访问冲突读取位置   0x00000b90。

附录

C ++ Project编译器选项(Debug build):

  

/ Od / D" WIN32" / D" _WINDOWS" / D" _DEBUG"   / D" _VC80_UPGRADE = 0x0710" / D" _AFXDLL" / D" _MBCS" / FD / EHa / MDd   /Yu"stdafx.h" /Fp"Debug\blah.pch" / FO"调试\"   /Fd"Debug\vc90.pdb" / W3 / WX / nologo / c / Zi / clr / TP / wd4793 / wd4996   / errorReport:提示

C ++项目链接器选项(Debug build):

  

/ OUT:" .. \调试\ blah.exe" / INCREMENTAL / NOLOGO / MANIFEST   /MANIFESTFILE:"Debug\blah.exe.intermediate.manifest"   / MANIFESTUAC:"电平=' asInvoker' uiAccess ='假'" / DEBUG   / ASSEMBLYDEBUG /PDB:" blah.pdb" / SUBSYSTEM:WINDOWS / LARGEADDRESSAWARE   / DYNAMICBASE:NO / FIXED:否/ MACHINE:X86 / ERRORREPORT:PROMPT   iphlpapi.lib UxTheme.lib ../ Libraries / Bridge.lib

C#.NET库编译器选项(Debug build):

  

/ Od / D" WIN32" / D" _DEBUG" / D" _WINDLL" / D" _UNICODE" / D" UNICODE" / FD   / EHa / MDd /Yu" stdafx.h" /Fp"Debug\Bridge.pch" / FO"调试\"   /Fd"Debug\vc90.pdb" / W3 / nologo / c / Zi / clr / TP / errorReport:提示   / FU" c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.dll" / FU   " C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ System.Data.dll中" / FU   " C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ system.xml.dll的" / FU   " Library.dll"

C#.NET库链接器选项(Debug build):

  

/ OUT:" Bridge.dll" / INCREMENTAL / NOLOGO / DLL / MANIFEST   /MANIFESTFILE:"Debug\Bridge.dll.intermediate.manifest"   / MANIFESTUAC:"电平=' asInvoker' uiAccess ='假'" / DEBUG   / ASSEMBLYDEBUG /PDB:"Bridge.pdb" / DYNAMICBASE / FIXED:否/ NXCOMPAT   / MACHINE:X86 / ERRORREPORT:PROMPT

1 个答案:

答案 0 :(得分:1)

通过简单地将DELAY LOAD应用于有问题的DLL来解决问题。我只能假设这从启动负载中删除了它,因此避免了启动冲突。

首次使用该功能时,DLL会在以后加载。它在所有工作站上正确运行。