如何定位特定版本的C++运行时?

Joh*_*ton 4 .net c++ side-by-side

我们有一个非常大的项目,主要是用C#编写的,它有一些用C++编写的小而重要的组件.我们将.NET 2.0的RTM作为最低要求版本.到目前为止,为了满足这一要求,我们确保在构建盒上只有.NET 2.0的RTM,以便C++片段链接到该版本.

更新:导致该问题的C++程序集是一个加载到托管进程的混合模式C++程序集.

不幸的是,当这个骗子准备在4月1日做一些事情时,我们的企业IT部门大力推动修补所有内容并更新,因此在构建盒上安装了3.5 SP1的所有内容.我们已尝试卸载以前发生的所有事情,但现在我们无法满足最低要求,因为构建在该特定框上的任何东西都需要.NET 2.0 SP1.

由于这个盒子似乎已被用尽,我们不能只卸载有问题的版本,有没有办法构建程序集并明确告诉他们使用.NET 2.0的RTM(v2.0.50727.42)?我已经看到了引用使用清单的页面,但我无法弄清楚如何实际实现适当的清单并将其放入程序集中.我的专长是在管理世界,所以我在这方面有点亏.

任何人都可以解释我如何使这些程序集针对.NET 2.0 RTM SxS程序集?

谢谢!

Joh*_*ton 8

虽然我很确定克里斯托弗的答案和代码示例(谢谢你,克里斯托弗!)是一个更优雅的解决方案的一部分,但是我们还在努力解决这个问题,并找到了一个非常相似但不同的解决方案.

第一步是为程序集创建清单:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

接下来,您必须在Configuration Properties - > Linker - > Manifest File下将'Generate Manifest'选项设置为'No',并在Configuration Properties - > Manifest Tool - > Input and Output下将'Embed Manifest'选项设置为'No' .

最后,要将新清单添加到程序集中,请将以下命令添加到项目的构建后步骤:

mt.exe /manifest "$(ProjectDir)cppassembly.dll.manifest" /outputresource:"$(TargetDir)\cppassembly.dll";#2 -out:"$(TargetDir)\cppassembly.dll.manifest"
Run Code Online (Sandbox Code Playgroud)

构建完成后,我们可以在Visual Studio中打开dll来查看RT_MANIFEST下的清单并确认它有我们的清单!

当我把Christopher的代码放在stdafx.h中时,它最终将它添加为一个额外的依赖...清单仍然在寻找v8.0.50727.762.它生成的清单看起来像这样:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

我无法跟踪另一个会删除或清除现有依赖项的开关.我更喜欢克里斯托弗的方法而不是后期构建步骤,但现在这种方法很有效.如果有人有任何关于如何清除任何现有依赖关系的额外输入.

谢谢!