【问题标题】:PowerShell Binary Module - Could not load Automation module in PS 5.1PowerShell 二进制模块 - 无法在 PS 5.1 中加载自动化模块
【发布时间】:2021-08-20 01:13:53
【问题描述】:

我正在开发一个 PS 二进制模块,并使用 PS 7.1 开发它。我尝试将dll 导入PS 5.1,但出现以下错误:

ipmo:无法加载文件或程序集“System.Management.Automation,版本=6.0.4.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。系统找不到指定的文件。

我的.csproj文件如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AssemblyName>assemblyName</AssemblyName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="PowerShellStandard.Library" Version="5.1.0-preview-06">
      <PrivateAssets>All</PrivateAssets>
    </PackageReference>
    <PackageReference Include="System.Management.Automation" Version="6.0.4" />
  </ItemGroup>

</Project>

此项目是使用PowerShell Module Template 通过dotnet cli: dotnet new psmodule 创建的。

【问题讨论】:

    标签: powershell module


    【解决方案1】:

    你是倒着做的。如果您希望某个模块同时与 Windows PowerShell 和 PowerShell Core 兼容,则需要针对 PowerShell 5.1 进行开发,然后使用 Portability Analyzer 来确定您的模块的可移植性。

    System.Management.Automation 包含大多数(如果不是全部)PowerShell 特定结构。如果您针对 PowerShell Core 构建,PowerShell 5.1 不会将该程序集的相同版本加载到内存中。因此,它找不到它正在寻找的程序集版本。

    Here is some more information你可能会发现这个主题很有用。


    编辑:

    如果您的模块不兼容两种方式,则无论如何都可以为 PowerShell 5.1 开发它,并使用 PowerShell Core 中的 WindowsCompatibility 模块,该模块应隐式使用仅在 Windows PowerShell 中可用的构造。有一些警告,该模块不得使用“实时”对象(如 CIM、远程连接等),并且该模块将有效地保持“仅限 Windows”,因为您无法在 Linux 或 MacOS 上运行 PowerShell 5.1。

    【讨论】:

    • 我对此进行了一段时间的研究,但我看不出我能做些什么来使它与5.1 兼容。要么不使用较新版本的 System.Management.Automation 的某些功能,要么使用 hackier 解决方案作为 here(第 15 行)。
    • 我假设是因为您使用的是Start-ThreadJob?线程作业很方便,但您应该能够使用Start-Job 处理大多数事情,即使它需要更多的肘部油脂
    • 但是如果你需要一个跨运行时兼容的模块,你是正确的,你必须使用两者中存在的语言特性。或者,您可以在调用某些 cmdlet 之前在模块中进行语言检查。相信我,我感受到了这种痛苦。我在 Linux 上运行的代码是 PowerShell Core,但在 Windows 中,我们还没有在整个组织范围内部署 PS Core。在两个版本之间跳转很糟糕。
    • 最后,我使用了来自ThreadJob GitHub 页面的 hack。我需要Job2 的一些功能,这些功能存在于System.Management.Automation >= v3 中。
    • 不能说我已经用 PowerShell 模块尝试过,但并不奇怪它可以工作。也就是说,如果您使用 PS Core 中不存在的任何功能,我认为这可能会破坏 PowerShell Core 中的模块。
    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2017-09-22
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多