运行Az模块命令后自定义C#命令集无法加载Azure程序集如何解决
解决自定义C# PowerShell命令集与Az模块的程序集版本冲突问题
问题根源
PowerShell默认在全局程序集加载上下文中加载所有依赖,先运行Az模块命令时,Az会优先加载它自身依赖的Azure.Core版本,该版本与你的自定义命令集依赖的1.15.0.0版本不匹配,导致后续加载自定义命令时找不到对应版本的程序集。
可行解决方案
方案1:添加程序集绑定重定向
在你的自定义命令集DLL同目录下,创建与DLL同名的配置文件,例如你的DLL名为MyAzureCmdlets.dll,则创建MyAzureCmdlets.dll.config,写入以下配置,将所有Azure.Core的版本请求重定向到你本地打包的版本:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Azure.Core" publicKeyToken="92742159e12e44c8" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.15.0.0" newVersion="1.15.0.0" /> </dependentAssembly> <!-- 若有其他冲突的Azure程序集,可在此处添加更多dependentAssembly节点 --> </assemblyBinding> </runtime> </configuration>
配置完成后重新导入模块即可生效。
方案2:对齐NuGet包版本与Az模块依赖
先查看你当前使用的Az.Accounts、Az.Storage模块依赖的Azure.Core版本,将你的C#项目中所有Azure相关NuGet包升级到与Az模块依赖版本一致,从根源消除版本冲突:
- 可在PowerShell中运行以下命令查看Az模块加载的Azure.Core版本:
(Get-Item (Get-Module Az.Accounts).Path).Directory.GetFiles("Azure.Core.dll").VersionInfo.ProductVersion
- 调整你C#项目的PackageReference版本与上述查询结果对齐后重新编译。
方案3:自定义程序集加载逻辑
在你的Cmdlet代码中添加AssemblyResolve事件处理,当程序集加载失败时,直接从你的模块安装目录加载对应程序集,跳过全局加载上下文的版本匹配:
using System.Reflection; using System.IO; // 在Cmdlet的静态构造函数中添加事件绑定 static YourCmdletClass() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); if (assemblyName.Name == "Azure.Core") { // 可通过当前程序集路径动态获取模块目录下的Azure.Core.dll路径 var dllPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Azure.Core.dll"); return Assembly.LoadFrom(dllPath); } // 其他冲突程序集可在此处添加对应加载逻辑 return null; }; }
方案4:使用独立加载上下文导入模块(仅PowerShell 7+支持)
导入自定义模块时使用独立的程序集加载上下文,完全隔离与Az模块的依赖:
Import-Module path/to/your/assembly.dll -CustomPSSnapIn
内容的提问来源于stack exchange,提问作者Shaun Luttin
相关产品推荐
相关产品推荐

