C++项目引用System.Management.Automation运行报强名称验证错误如何解决?
解决方案
针对NuGet安装仅生成packages.config无生效的问题
- 首先确认项目已开启CLR支持:打开项目属性 -> 配置属性 -> 高级 -> 公共语言运行时支持,设置为
公共语言运行时支持(/clr),原生C++项目无法直接引用.NET程序集,必须开启该选项生成混合模式程序集。 - C++/CLI项目默认的packages.config格式不会自动注入程序集引用,需要切换NuGet包管理格式:右键项目 -> 管理NuGet包 -> 点击右上角设置齿轮 -> 常规 -> 默认包管理格式改为
PackageReference,删除原有packages.config文件后重新安装目标NuGet包,安装完成后引用会自动生效。
针对运行时抛出FileLoadException、强名称验证失败的问题
- 首先确认程序集版本与项目运行时匹配:System.Management.Automation 7.2.0.0对应.NET 6+运行时,如果你项目使用的是.NET Framework 4.x,必须安装
Microsoft.PowerShell.5.1.ReferenceAssembliesNuGet包使用PowerShell 5.1版本的程序集,跨运行时版本引用会直接触发强名称验证失败。 - 开发环境可临时禁用对应程序集的强名称验证:打开管理员权限的Visual Studio开发者命令提示符,依次执行以下命令:
reg ADD "HKLM\SOFTWARE\Microsoft\StrongName\Verification\System.Management.Automation,7.2.0.0,31bf3856ad364e35" /f reg ADD "HKLM\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\System.Management.Automation,7.2.0.0,31bf3856ad364e35" /f
该配置仅适用于开发调试场景,生产环境禁止使用。
- 添加程序集绑定重定向配置:在项目根目录新建
app.config文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Management.Automation" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.2.0.0" newVersion="7.2.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
之后打开项目属性 -> 配置属性 -> 生成事件 -> 后期生成事件,添加命令:copy /Y "$(ProjectDir)app.config" "$(TargetPath).config"
确保运行时能读取到绑定重定向规则。
针对复制DLL到目录仍加载失败的问题
- System.Management.Automation 7.x版本存在大量链式依赖项,手动复制单DLL无法满足运行要求,使用PackageReference格式安装NuGet包后,构建时会自动将所有依赖项复制到输出目录,无需手动操作。
- 确认项目平台目标与程序集架构匹配:如果引用的是x64版本的PowerShell程序集,项目平台目标需设置为x64,禁止设置为AnyCPU或x86,否则会触发加载失败。
内容的提问来源于stack exchange,提问作者nigelh
相关产品推荐
相关产品推荐

