【问题标题】:How does Visual Studio creates assembly references inside manifest files for C++ projects?Visual Studio 如何在 C++ 项目的清单文件中创建程序集引用?
【发布时间】:2011-03-24 09:59:34
【问题描述】:

我有一台新安装的开发机器,装有 Windows 7 和 Visual Studio 2010 Service Pack 1。

在我们的解决方案中,我们有一个供多个应用程序使用的 C++ DLL。

在 Release 配置中一切正常,但在 Debug 配置中,当我尝试运行其中一个应用程序时,我收到了应用程序无法正确启动的错误对话框。

我发现这是我们 C++ DLL 中 SxS 配置的问题。由于某种原因,DLL 的清单包含以下参考:

<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>

而且我的机器上没有安装 VC90 运行时库的 Debug 版本。

由于我们之前遇到过一些类似的问题,所以我们总是确保我们使用的外部库是用我们用于开发的相同 VS 版本编译的。

但看起来某处有对 VC90 DebugCRT 的引用。我试图在我们的外部库上使用 Dependency Walker 和 PeStudio 来解决这个问题,但我在任何地方都找不到对 VC90 DebugCRT Dll 的任何引用。

我实际上是通过在我们的 Dll 的链接器设置中禁用清单文件的生成来解决这些问题的。因此,VC90 DebugCRT 实际上并不是应用程序运行所必需的,但无论如何都会被拉进来。

我现在只是想知道 VS 在构建过程中如何确定要包含在清单文件中的引用以及如何诊断该引用来自何处?

【问题讨论】:

    标签: visual-studio-2010 visual-c++ dll manifest winsxs


    【解决方案1】:

    首先检查典型问题,例如“Properties/C++/Code Generation/Runtime lib”和“_DEBUG”未定义,适用于您所依赖的应用程序和库。如果没有找到它,打开详细链接“链接器/常规/显示进度”,看看它是否告诉你它在调试 crt 中寻找什么。

    【讨论】:

    • 我尝试执行您建议的检查,但是我无法检查我所有的外部库,因为对于某些我只有二进制文件。但是所有这些都是用 VS 2010 构建的,除了一个用 VS 2005 构建的。详细的链接日志没有给我任何线索。我用 PeStudio 检查了所有外部 Dll,只有一个外部库引用了 msvcr80.dll,所有其他库都引用了 msvcr100d.dll 等库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多