c# - 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
。同样,有什么区别,我应该使用什么?
谢谢!
解决方案
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 模块程序集依赖冲突中有更好的介绍。
推荐阅读
- git - 克隆存储库,然后从原始更改中更新
- flutter - 在 Android Studio 中运行和热重载颤振的问题(坏状态:未来已经完成)
- html - css 剪辑路径之间的小间隙
- c# - 在 asp.net MVC 中生成条码
- java - 批量插入大型 MongoDB 集合的性能缓慢
- ruby-on-rails - Rails 从关联中选择计算值
- c# - How to Except<> specifing another key? Or faster way to differences two huge List<>?
- magento2 - Magento 2 Min - max 产品属性查询
- .net - 在 vb.Net 中访问路径被拒绝
- image - 在 docker 中创建映像时 Cygwin 无法正常工作