Debug Build App定位发布CRT程序集

时间:2009-08-20 09:44:52

标签: windows visual-studio-2008 assemblies manifest side-by-side

我们有一个c ++应用程序,我最近从Linux / gcc移植到使用Visual Studio 2005在Windows上构建。该应用程序使用第三方库,它只提供使用优化CRT DLL的DLL(即它们不提供等价物)哪个链接到调试CRT DLL)。使用VS2005这似乎不是问题=调试版本在System32目录中找到了优化的CRT DLL。

我现在正在尝试使用VS2008构建和运行我们的应用程序,并且调试版本无法运行,因为它无法找到优化的CRT DLL(msvc690.dll)。 VC9 CRT DLL在具有GUID样式名称的目录中被剔除 - 我相信这是一个并排的程序集,应用程序应该使用应用程序的清单找到它。但是,在app exe中构建和嵌入的清单只指定了调试CRT程序集:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

我不是Windows专家(至少不再是Windows专家),所以这对我来说都是新手。这里有什么正确的解决方案?我是否需要告诉清单编译器将优化的CRT DLL添加到程序集中?如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:1)

确定。如果你在VS 2008中打开第三方库dll(确保它选择OpenWith&gt;资源编辑器)它是否包含它自己的清单?

如果确实如此,或者即使它没有,它也可以让DependencyWalker看到这个第三方库试图链接到哪个确切的运行时dll。

它与VS2005一起工作,而不是VS2008,这意味着dll想要使用VS2005运行时的releasemode版本:msvcr80.dll

你提到msvc690.dll,它不响铃我:Visual Studio 6使用简单命名的msvcrt.dll - 使用版本化dll运行时的第一个版本的Visual Studio是VS 2003 .NET或者其他东西: msvcrt7.dll

无论如何,如果第三方库不包含自己的清单资源,那么最简单的方法是将依赖程序集引用添加到应用程序清单。

有很多方法可以做到这一点 - 你可以创建一个清单fragement作为XML文件并将其添加到你的应用程序“Configuration Properties&gt; Manifest Tool&gt; Input and Output&gt; Additional Manifest Files”

我发现在VS2008中合并其他依赖程序集指令的最方便方法是使用linkers / manifestdependency命令行选项。

如果将以下代码段添加到项目中的文件中,它将为链接器提供必要的提示:

#define X_CRT_ASSEMBLY_VERSION "9.0.21022.8"
#pragma comment(linker,"/manifestdependency:\"type='win32' "\
    "name='"Microsoft.VC80.CRT' "
    "version='8.0.??.??' "                         \
    "processorArchitecture='x86' "                                 \
    "publicKeyToken='????????'\"")

这是因为我不知道VS2005库的版本号或公钥令牌。如果你可以查看它们并填写它们,它应该是游泳的。