首页 > 解决方案 > PowerShell:.NET 程序集的 Import-Module 或 Add-Type?

问题描述

我正在使用 PowerShell 5.1、Windows 10 x64。

我应该使用这 2 个 cmdlet 中的哪一个来将 .NET 程序集(特别是 .NET Framework 4+ 程序集)加载到 PowerShell 中?它们之间的核心区别是什么?我想加载程序集以访问类型、创建对象、调用方法等。

我在文档中没有找到任何明确的陈述。这些 cmdlet 被描述为完全不同的东西。MSDN 文档Import-Module甚至不包含.dll加载程序集的示例——只有 PowerShell 模块。但是Import-Module适用于 .NET Framework 程序集(.dll尽管如此):我可以完美地使用导入程序集中的类型,它们引用的程序集也被解析和加载。这是为什么?

换句话说,根据我的经验,我还没有发现这两种程序集导入方法之间有任何区别(至少对于 .NET Framework 4.dll程序集而言)。

这篇旧博文:在 Windows PowerShell 中使用 .NET Framework 程序集甚至使用Reflection.Assembly.LoadWithPartialName! 我相信这是因为他们从 GAC 加载程序集并且不想指定它的完整路径(不过我可能错了)。

对于我的程序集,我知道它们的完整路径,因此我可以在Import-Module和中指定它Add-Type。同样,有什么区别,我应该使用什么?

谢谢!

标签: c#.netpowershell.net-4.0powershell-5.1

解决方案


Powershell 有三种主要的导入类的方法,不包括 .net 方法,如reflection.assembly. 一般来说,它们都可以满足您的需求,但具有额外的功能:

导入模块

具有迄今为止最大的灵活性,可以导入基本模块(通常是 .psd1 或 .psm1 文件)及其所需的程序集、CIM 模块(带有 CDXML 文件)、 -type[Assembly]对象、通过 .dll 文件的程序集、通过 .dll 文件的 cmdlet,可能还有更多。导入 PS 模块有更多功能,但对于“加载整个事物”以外的类没有。

添加类型

如果你需要的话,有一堆额外的功能可以有效地添加类。例如,它可以将 C#/VB/JScript 类型定义作为字符串直接加载。我个人只在需要时使用它,或者如果无法正确导入 dll 文件import-module,但帮助中列出了更多功能。它不像其他选项那样导入模块。

使用

相对较新,仅在 v5.1+ 中。它将从模块中导入类定义,与Import-Module语句#requires不同。否则,它的行为与 非常相似ipmo,但我喜欢它的可读性并且更喜欢using namespace.net 版本:

using module ModuleName
# or
using assembly 'C:\path\to\assembly.name.subassembly.whatever.dll'
using namespace assembly.name.subassembly.whatever.additional.namespace

[NiceAndShort]::Foo

他们引用的程序集也被解析和加载。这是为什么?

不幸的是,powershell 采用了将每个程序集(及其依赖项,以及 powershell 自己的依赖项)简单地加载到同一上下文中的路径。在处理冲突的依赖版本时,这可能会引起一些麻烦。解决 PowerShell 模块程序集依赖冲突中有更好的介绍。


推荐阅读