Windows应用部署私有C运行库的最佳实现方案是什么
私有部署VC++ CRT运行库相关问题解答
如何强制所有应用组件从指定公共目录加载CRT DLL
有三种可落地的实现方案:
- 自定义入口提前修改DLL搜索路径
对所有自行编译的exe,通过链接器/ENTRY参数指定自定义入口函数,在CRT初始化执行前先调用AddDllDirectory(L"你的公共CRT目录绝对路径")添加搜索路径,之后再跳转调用默认CRT入口mainCRTStartup/wWinMainCRTStartup完成启动。该方案优先级最高,进程内所有依赖CRT的dll都会遵循修改后的搜索路径加载。 - 嵌入带探测路径的Manifest配置
给所有exe嵌入包含probing配置的manifest文件,示例配置如下:
不需要修改代码,系统加载CRT程序集时会自动按<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" name="MyApp.Product"/> <probing privatePath="..\Common"/> </assembly>privatePath指定的相对路径查找,适配你提到的bin、modules、plugins和Common同级的目录结构。 - 安装时添加公共目录到系统PATH
安装程序将公共CRT目录路径添加到系统或当前用户的PATH环境变量中,所有程序启动时会自动搜索该目录。缺点是如果PATH中存在优先级更高的同版本CRT,可能加载到非预期的副本。
私有部署的CRT能否获得微软官方更新推送
不能。只有通过vcredist安装到系统全局目录的CRT组件才会被Windows Update识别,跟随系统更新获得安全补丁和版本迭代。你存放在自身应用目录下的私有CRT副本属于应用私有文件,微软更新服务不会扫描、修改这类文件。
私有CRT的最优更新方案
- 优先将CRT更新纳入你自有应用的更新体系:每当微软发布CRT安全更新公告后,将对应版本的CRT DLL打包到你的应用更新包中,更新时直接覆盖公共目录下的旧CRT文件即可,所有子目录的应用组件下次启动时会自动加载新版本。
- 如果不想自行维护CRT更新,可以调整方案为安装时静默安装对应版本的vcredist,同时在应用启动时增加CRT版本校验,若检测到CRT丢失或版本过低就弹出修复提示引导用户重装运行库,该方案可以复用微软的更新通道,但需要处理用户意外卸载全局CRT的异常场景。
内容的提问来源于stack exchange,提问作者V Paul
相关产品推荐
相关产品推荐

