PowerShell:.NET 程序集的导入模块或添加类型?
PowerShell: Import-Module or Add-Type for .NET assemblies?
我正在使用 PowerShell 5.1,Windows 10 x64。
我应该使用这 2 个 cmdlet 中的哪一个来将 .NET 程序集(尤其是 .NET Framework 4+ 程序集)加载到 PowerShell 中?它们之间的核心区别是什么?我想加载用于访问类型、创建对象、调用方法等的程序集
我没有在文档中找到任何明确的声明。这些 cmdlet 被描述为完全不同的东西。 Import-Module
的 MSDN 文档甚至不包含 .dll
程序集加载的示例——仅包含 PowerShell 模块。但是 Import-Module
适用于 .NET Framework 程序集(不过仅 .dll
):我可以完美地处理来自导入程序集的类型,它们引用的程序集也被解析和加载。这是为什么?
换句话说,根据我的经验,我还没有发现这两种程序集导入方法之间有任何区别(至少对于 .NET Framework 4 .dll
程序集)。
这个老博客post:Using .NET Framework Assemblies in Windows PowerShell竟然用Reflection.Assembly.LoadWithPartialName
!我相信这是因为他们从 GAC 加载程序集并且不想指定它的完整路径(虽然我可能错了)。
对于我的程序集,我知道它们的完整路径,所以我可以在 Import-Module
和 Add-Type
中指定它。同样,有什么区别,我应该使用什么?
谢谢!
Powershell 有三种导入 classes 的主要方法,不包括像 reflection.assembly
这样的 .net 方法。一般来说,它们都可以很好地满足您的需求,但还有额外的功能:
导入模块
具有迄今为止最大的灵活性,可以导入基本模块(通常是 .psd1 或 .psm1 文件)及其所需的程序集、CIM 模块(带有 CDXML 文件)、[Assembly]
类型的对象、程序集通过.dll 文件、通过 .dll 文件的 cmdlet,可能还有更多。导入 PS 模块有更多功能,但除了 “加载整个东西”.
之外 classes 没有
添加类型
有很多额外的功能,可以在需要时有效地添加 classes。例如,它可以将 C#/VB/JScript 类型定义作为字符串直接加载。我个人只在需要时使用它,或者如果 import-module
无法正确导入 dll 文件,但帮助中列出了更多功能。它不像其他选项那样导入模块。
使用
相对较新,仅在 v5.1+ 中。它将从模块中导入 class 定义,这与 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
their referenced assemblies are resolved and loaded too. Why is that?
不幸的是,powershell 采用了将每个程序集(及其依赖项,以及 powershell 自身的依赖项)简单加载到同一上下文的路径。在处理冲突的依赖版本时,这可能会引起一些麻烦。最好在 Resolving PowerShell module assembly dependency conflicts.
中介绍
我正在使用 PowerShell 5.1,Windows 10 x64。
我应该使用这 2 个 cmdlet 中的哪一个来将 .NET 程序集(尤其是 .NET Framework 4+ 程序集)加载到 PowerShell 中?它们之间的核心区别是什么?我想加载用于访问类型、创建对象、调用方法等的程序集
我没有在文档中找到任何明确的声明。这些 cmdlet 被描述为完全不同的东西。 Import-Module
的 MSDN 文档甚至不包含 .dll
程序集加载的示例——仅包含 PowerShell 模块。但是 Import-Module
适用于 .NET Framework 程序集(不过仅 .dll
):我可以完美地处理来自导入程序集的类型,它们引用的程序集也被解析和加载。这是为什么?
换句话说,根据我的经验,我还没有发现这两种程序集导入方法之间有任何区别(至少对于 .NET Framework 4 .dll
程序集)。
这个老博客post:Using .NET Framework Assemblies in Windows PowerShell竟然用Reflection.Assembly.LoadWithPartialName
!我相信这是因为他们从 GAC 加载程序集并且不想指定它的完整路径(虽然我可能错了)。
对于我的程序集,我知道它们的完整路径,所以我可以在 Import-Module
和 Add-Type
中指定它。同样,有什么区别,我应该使用什么?
谢谢!
Powershell 有三种导入 classes 的主要方法,不包括像 reflection.assembly
这样的 .net 方法。一般来说,它们都可以很好地满足您的需求,但还有额外的功能:
导入模块
具有迄今为止最大的灵活性,可以导入基本模块(通常是 .psd1 或 .psm1 文件)及其所需的程序集、CIM 模块(带有 CDXML 文件)、[Assembly]
类型的对象、程序集通过.dll 文件、通过 .dll 文件的 cmdlet,可能还有更多。导入 PS 模块有更多功能,但除了 “加载整个东西”.
添加类型
有很多额外的功能,可以在需要时有效地添加 classes。例如,它可以将 C#/VB/JScript 类型定义作为字符串直接加载。我个人只在需要时使用它,或者如果 import-module
无法正确导入 dll 文件,但帮助中列出了更多功能。它不像其他选项那样导入模块。
使用
相对较新,仅在 v5.1+ 中。它将从模块中导入 class 定义,这与 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
their referenced assemblies are resolved and loaded too. Why is that?
不幸的是,powershell 采用了将每个程序集(及其依赖项,以及 powershell 自身的依赖项)简单加载到同一上下文的路径。在处理冲突的依赖版本时,这可能会引起一些麻烦。最好在 Resolving PowerShell module assembly dependency conflicts.
中介绍