我假设读者熟悉混合托管/非托管代码系统以及为什么需要它们。这个问题不会涉及到这个问题,而是使用Visual Studio 2008编译器和链接器控件构建这样一个系统的机制。
首先,摆脱糠..我的调查研究如下:
这一切都在Visual Studio 2008下的所有开发人员工作站上构建和运行。
我们现在在项目中包含第三方C#.NET3.5 SP1库。该库是使用本机C ++桥为互操作构建的。原始C ++项目引用此新库的导入文件作为其链接器输入的一部分。所有非常标准的东西,并在论坛上很好地引用。
第三方库的构建如下:
在我们的八个开发人员工作站上,Debug(和Release)构建所有构建并正确启动。只有一个开发人员工作站在启动时收到以下错误:
Windows在blah.exe中触发了断点 这可能是由于堆中的损坏,这表示blah.exe或其加载的任何DLL中存在错误。
这在应用程序启动之前发生,并且证明难以追踪。我已经使用过/试过/删除了以下内容:
如果我现在只是为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
答案 0 :(得分:1)
通过简单地将DELAY LOAD应用于有问题的DLL来解决问题。我只能假设这从启动负载中删除了它,因此避免了启动冲突。
首次使用该功能时,DLL会在以后加载。它在所有工作站上正确运行。