.NET6 x64独立部署程序调用x86程序报hostfxr.dll failed错误如何解决
问题根因
- 你采用self-contained模式发布的x64架构项目A,运行目录内置了x64版本的.NET运行时组件,包括
hostfxr.dll,进程启动时默认会优先从当前工作目录加载依赖 - 你调用的项目B为x86架构,启动时默认继承了项目A的工作目录,优先加载到了x64版本的
hostfxr.dll,架构不匹配导致加载失败
修复方案
方案1(推荐,改动最小):显式指定项目B的工作目录
启动项目B时,将工作目录指定为项目B自身的所在文件夹,避免读取项目A目录下的x64运行时组件,参考代码:
var processInfo = new ProcessStartInfo { FileName = @"此处替换为项目B的完整路径,例如D:\tools\projectB.exe", WorkingDirectory = @"此处替换为项目B所在的文件夹路径,例如D:\tools\", UseShellExecute = false }; Process.Start(processInfo);
方案2:将项目B也做独立部署
将x86架构的项目B同样采用self-contained + win-x86参数单独发布,发布后的文件夹会自带x86版本的hostfxr.dll,启动时会优先读取自身目录下的正确版本文件,不会出现架构冲突。
方案3:修改项目A的发布模式
将项目A的发布模式从self-contained改为框架依赖部署(FDD),项目A的运行目录不会内置.NET运行时组件,项目B启动时会自动从系统全局的.NET运行时路径查找对应x86版本的hostfxr.dll,该方案需要提前在目标机器上安装x86版本的.NET 6桌面运行时。
方案4:统一两个项目的架构
如果项目B没有必须依赖x86的第三方组件,直接将项目B的目标平台改为x64和项目A保持一致,从根源消除架构不匹配的问题。
内容的提问来源于stack exchange,提问作者Kyeonghwan Jeong
相关产品推荐
相关产品推荐

