Deployment 如果是纯MSIL(/clr:pure),我应该在应用程序目录中包括哪些MSVCR dll?

Deployment 如果是纯MSIL(/clr:pure),我应该在应用程序目录中包括哪些MSVCR dll?,deployment,dll,installation,c++-cli,clr,Deployment,Dll,Installation,C++ Cli,Clr,我一直在网上搜寻关于这方面的信息,如果没有找到一个没有安装CRT dll的机器,就无法得出安全的结论。我的应用程序非常小,我不想给用户带来潜在的臃肿安装或下载他们不需要的东西的负担 我很想把220kb的msvcm90.dll C运行时导入库编译成100%纯MSIL代码。所有代码都符合应用程序目录中MSIL和2kb Microsoft.VC90.CRT.manifest的ECMA URT规范。但是,声明这些文件现在存储在全局程序集缓存中 有人能验证我提出的解决方案吗 我所说的很多话都得到了这篇文章

我一直在网上搜寻关于这方面的信息,如果没有找到一个没有安装CRT dll的机器,就无法得出安全的结论。我的应用程序非常小,我不想给用户带来潜在的臃肿安装或下载他们不需要的东西的负担

我很想把220kb的msvcm90.dll C运行时导入库编译成100%纯MSIL代码。所有代码都符合应用程序目录中MSIL和2kb Microsoft.VC90.CRT.manifest的ECMA URT规范。但是,声明这些文件现在存储在全局程序集缓存中

有人能验证我提出的解决方案吗

我所说的很多话都得到了这篇文章的支持,但尽管他有投票权,但我仍然无法被独立证词的声音所说服

请参考我的清单,它只有一个依赖项:

<dependency>
  <dependentAssembly>
    <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='idontknowenuff' />
  </dependentAssembly>
</dependency>
由于这并不仅仅指定托管运行时,如果没有从MS下载4Mb的完整安装,我的解决方案似乎无法工作


更复杂的是,我的VC/redist目录中的运行时版本是9.0.30729.1,但我认为它将向后兼容。

谷歌图书出现了:

如果您编译的代码使用带有/clr选项或/clr:pure选项的CRT,那么您将得到相应的纯MSIL CRT链接,而不是本地CRT,Gordon Hogenson-2006


正如ILDASM显示的那样,这似乎是错误的。模块extern MSVCR90.dll作为嵌入清单的第一行。我将把这个答案留给GC,或者作为一个提醒,不是所有发布的东西都是福音。

如果在调试器中运行,启用混合托管+本机调试,模块窗口应该显示程序运行时加载的DLL。

如果没有3 GB的Windows下载,代码也无法工作,当你依赖托管代码的时候,你不可能为小事烦恼。与Windows一样,如果您不想预安装依赖项,请让您的客户预安装。清单已经嵌入到DLL中,不要编写自己的清单。运行时DLL放在并行缓存中,而不是GAC中。它在运行时被检查,你不能搞乱它。VS2010再次支持应用程序本地部署。好的,汉斯,我完全同意。我使用ILDASM进行了检查,MSVCR90.DLL与MSVCM90.DLL相邻。因为他们已经需要.NET了,所以这并不是什么大问题,我希望biggie能覆盖我所有的基础知识。MSVCRT可再发行版本的版本控制如何?它是否从9.0.3xx向后兼容到9.0.2xx?是的,9.0.30729是SP1版本。从那时起,已经有几次安全更新。安装运行时也会部署映射版本的发布者策略文件。我不太关心它们的安装位置,只关心它们的安装位置,我想你是说,在并行安装时,它们是非共享的,并且位于应用程序的程序文件文件夹中。如果是这样,我想知道缓存是否是一个合适的术语,与理想的、可重复使用的、可能共享的空间连接?它们是共享的。这就是所有这些麻烦的重点,DLL地狱在共享DLL中非常突出。谷歌“windows并排缓存”来了解更多这方面的工作原理。啊,现在我在VC2008 Express中看到了这一点,只需要再次开始调试。很确定MSVCM90.dll是MSVCR90.dll的包装器,但ILDASM列出了两者。