C#编写PowerShell Cmdlet访问Azure Key Vault时Azure.Core加载失败
解决Azure.Core程序集加载失败问题
以下是针对你遇到的PowerShell Cmdlet加载Azure.Core失败问题的具体解决步骤:
1. 统一NuGet依赖版本
Azure.Identity和Azure.Security.KeyVault.Secrets都依赖Azure.Core,版本不匹配会导致加载失败。在项目文件(.csproj)中显式指定Azure.Core的版本,确保与其他Azure包依赖的版本一致:
<PackageReference Include="Azure.Core" Version="1.25.0" /> <PackageReference Include="Azure.Identity" Version="1.10.0" /> <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.5.0" />
执行以下命令清理并重新还原依赖:
dotnet clean dotnet restore
2. 确保依赖项复制到输出目录
在项目文件中设置Azure相关包的PrivateAssets为all,强制将依赖DLL复制到输出文件夹:
<PackageReference Include="Azure.Identity" Version="1.10.0"> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.5.0"> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Azure.Core" Version="1.25.0"> <PrivateAssets>all</PrivateAssets> </PackageReference>
3. 修正异步方法实现
你的代码中使用async void ProcessRecord()会导致PowerShell在异步操作完成前退出,同时可能引发隐藏的资源加载问题。改为异步任务实现:
using Azure.Identity; using Azure.Security.KeyVault.Secrets; using System.Management.Automation; using System.Threading.Tasks; namespace My.PowerShell.Commands; [Cmdlet(VerbsCommon.Get, "DGAMasterKeyPwd")] [OutputType(typeof(string))] public class GetDGAMasterKeyPwdCmdlet : Cmdlet { protected override void ProcessRecord() { ProcessRecordAsync().GetAwaiter().GetResult(); } private async Task ProcessRecordAsync() { var vaultUri = $"https://XXXXXXX.vault.azure.net"; var client = new SecretClient(new Uri(vaultUri), new DefaultAzureCredential()); var secret = await client.GetSecretAsync("XXXXXXXXX"); WriteObject(secret.Value.Value); // 输出密码字符串而非Secret对象 } }
4. 验证PowerShell与.NET版本兼容性
确保项目目标框架与PowerShell 7的基础.NET版本匹配:
- PowerShell 7.2+基于.NET 6,项目文件中设置:
<TargetFramework>net6.0</TargetFramework> - 如果使用更高版本的.NET(如7/8),需对应升级PowerShell到7.3/7.4版本。
5. 检查模块部署结构
将编译后的Cmdlet DLL与所有依赖的Azure DLL(包括Azure.Core.dll)放在同一目录下,再通过Import-Module加载模块,避免PowerShell找不到依赖文件。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

