我使用的是PowerShell 5.1, Windows 10 x64。
我应该使用这两个cmdlet中的哪一个来加载。net程序集(特别是。net Framework 4+程序集)到PowerShell中?它们之间的核心区别是什么?我想加载程序集来访问类型,创建对象,调用方法等。
我在文档中没有发现任何明确的语句。对这些cmlet的描述就像它们是完全不同的东西一样。Import-Module
的MSDN文档甚至没有包含.dll
程序集加载的示例——只有PowerShell模块。然而,Import-Module
工作与。net框架程序集(.dll
只,虽然):我可以完美地工作与类型从导入的程序集,他们的引用程序集也被解析和加载。为什么呢?
换句话说,根据我的经验,我还没有发现这两个程序集导入方法之间的任何差异(至少对于。net Framework 4.dll
程序集)。
这个旧的博客文章:在Windows PowerShell中使用。net框架程序集甚至使用Reflection.Assembly.LoadWithPartialName
!我相信这是因为他们从GAC加载程序集,并且不想指定它的完整路径(尽管我可能错了)。
对于我的程序集我知道它们的完整路径,所以我可以在Import-Module
和Add-Type
中指定它。还是那句话,区别是什么,我应该用什么?
谢谢!
Powershell有三种主要的方法来导入类,不包括reflection.assembly
这样的。net方法。一般来说,它们都可以很好地完成您需要的功能,但有额外的功能:
Import-Module
迄今为止具有最大的灵活性,并且可以导入基本模块(通常是.psd1或.psm1文件)及其所需的程序集、CIM模块(带有CDXML文件)、[Assembly]
类型的对象、通过.dll文件的程序集、通过.dll文件的cmdlet等等。还有更多导入PS模块的特性,但除了"load the whole thing">之外的类就没有了。
添加类型
有一堆额外的功能,可以在需要时有效地添加类。例如,它可以将c#/VB/JScript类型定义作为字符串并直接加载它们。我个人只在我需要的时候使用它,或者如果一个dll文件不能被import-module
正确导入,但是在帮助中列出了更多的功能。它不像其他选项那样导入模块。
使用相对较新,仅在v5.1+中。它将从模块导入类定义,这与Import-Module
或#requires
语句不同。否则,它的行为非常类似于ipmo
,但我喜欢它的可读性,更喜欢using namespace
的。net版本:
using module ModuleName
# or
using assembly 'C:pathtoassembly.name.subassembly.whatever.dll'
using namespace assembly.name.subassembly.whatever.additional.namespace
[NiceAndShort]::Foo
它们的引用程序集也被解析和加载。为什么呢?
不幸的是,powershell采取的路径是简单地将每个程序集(及其依赖项,以及powershell自己的依赖项)加载到同一个上下文中。在处理相互冲突的依赖版本时,这可能会导致一些麻烦。最好在解决PowerShell模块组件依赖冲突中介绍它。