PowerShell Core 7.2 模块程序集加载冲突问题咨询
运行环境为PowerShell 7.2.4,涉及两个自定义PowerShell Core模块:Net6PowerShellModule与NetstandardPowerShellModule,两个模块的项目文件、代码、清单文件如下:
Net6PowerShellModule 相关文件
- Net6PowerShellModule.csproj:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <None Remove="Net6PowerShellModule.psd1" /> </ItemGroup> <ItemGroup> <Content Include="Net6PowerShellModule.psd1"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" /> <PackageReference Include="System.Management.Automation" Version="7.2.4" /> </ItemGroup> </Project>
- Test-Net6Cmdlet.cs:
using System.Management.Automation; namespace Net6PowerShellModule { [Cmdlet("Test", "Net6Cmdlet")] public class TestNet6Cmdlet : PSCmdlet { protected override void ProcessRecord() { var type = typeof(Microsoft.Extensions.DependencyInjection.IServiceCollection); WriteObject("Net6 Cmdlet Run."); } } }
- Net6PowerShellModule.psd1:
@{ RootModule = 'Net6PowerShellModule.dll' ModuleVersion = '0.0.1' GUID = '8c1bd929-32bd-44c3-af6b-d9dd261e34f3' CmdletsToExport = 'Test-Net6Cmdlet' }
NetstandardPowerShellModule 相关文件
- NetstandardPowerShellModule.csproj:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <None Remove="NetstandardPowerShellModule.psd1" /> </ItemGroup> <ItemGroup> <Content Include="NetstandardPowerShellModule.psd1"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" /> <PackageReference Include="System.Management.Automation" Version="6.1.2" /> </ItemGroup> </Project>
- Test-NetstandardCmdlet.cs:
using System.Management.Automation; namespace NetstandardPowerShellModule { [Cmdlet("Test", "NetstandardCmdlet")] public class TestNetstandardCmdlet : PSCmdlet { protected override void ProcessRecord() { var type = typeof(Microsoft.Extensions.DependencyInjection.IServiceCollection); WriteObject("Netstandard 2.0 Cmdlet Run."); } } }
- NetstandardPowerShellModule.psd1:
@{ RootModule = 'NetstandardPowerShellModule.dll' ModuleVersion = '0.0.1' GUID = 'eef615d0-aecf-4e89-8f4c-53174f8c99d6' CmdletsToExport = 'Test-NetstandardCmdlet' }
针对两个模块共执行两组测试:
第一组测试流程:
- 导入
Net6PowerShellModule - 导入
NetstandardPowerShellModule - 执行
Test-Net6Cmdlet - 执行
Test-NetstandardCmdlet
测试结果:所有命令正常运行,进程中仅加载了6.0.0版本的
Microsoft.Extensions.DependencyInjection.Abstractions程序集。- 导入
第二组测试流程:
- 导入
Net6PowerShellModule - 导入
NetstandardPowerShellModule - 执行
Test-NetstandardCmdlet - 执行
Test-Net6Cmdlet
测试结果:执行
Test-Net6Cmdlet时抛出错误:Test-Net6Cmdlet: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (0x80131621)
- 导入
根据Stack Overflow相关技术解答,PowerShell (Core) 7+环境下后续尝试加载不同版本的同名程序集时,本应直接抛出语句终止错误:Assembly with same name is already loaded.,但第一组测试并未触发该错误且可正常运行,该行为与文档描述不符。
若在两个模块的psd1清单文件中都添加RequiredAssemblies = @('Microsoft.Extensions.DependencyInjection.Abstractions.dll')配置,则无论模块加载顺序、命令执行顺序如何,都会触发预期的“同名程序集已加载”错误。
目前已查阅官方PowerShell依赖冲突解决文档、Assembly Load Contexts相关官方技术博客、Stack Overflow相关问答,仍无法解释上述场景的加载行为差异,也无法明确在psd1清单中声明RequiredAssemblies与仅在代码中引用依赖这两种方式的程序集加载逻辑区别。
内容的提问来源于stack exchange,提问作者semptra

