问题 如何在PowerShell v3模块中可靠地引用外部.NET程序集?


我正在开发一个PowerShell v3模块,它需要使用一些外部.NET程序集中包含的类型。

我希望这个模块合理地自包含,以便于部署,我不想依赖于在GAC中加载这些程序集。理想情况下,我想将所需的程序集dll放在模块文件夹中,然后依赖PowerShell在加载模块时自动加载这些程序集。

我知道我可以使用Add-Type命令来强制加载程序集,如下所示:

Add-Type -AssemblyName "Some.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=sometoken"

但我也读过模块清单中所需的程序集属性,我希望这种方法可以消除看似脆弱的Add-Type代码:

# Assemblies that must be loaded prior to importing this module
# RequiredAssemblies = @()

在模块中引用外部组件的最可靠方法是什么?在模块加载时,声明清单中的依赖项会隐式加载程序集吗?如果我利用模块清单列出所需的程序集,我还是要编写加载程序集的代码吗?

我真的不是在寻找一个简单的“让它工作”的解决方案,因为我已经使用Add-Type方法将其工作了......我正在寻找最可靠的方法来进行指导和推荐。


9967
2017-08-28 19:28


起源



答案:


New-ModuleManifest 它的文档 -RequiredAssemblies 参数同意:

指定模块所需的程序集(.dll)文件。输入程序集文件名。 Windows PowerShell在更新类型或格式,导入嵌套模块或导入RootModule键值中指定的模块文件之前加载指定的程序集。

使用此参数列出模块所需的所有程序集,包括必须加载以更新任何格式的程序集或键入FormatsToProcess或TypesToProcess键中列出的文件

我找不到任何不同的东西(例如 MSDN)。


10
2017-08-28 19:37



您知道如何在此属性中可靠地列出程序集吗?如果我使用完全限定名称并将程序集dll放在模块的文件夹中就足够了,还是需要提供某种路径?装配加载程序在哪里寻找这些装配? - syneptody
@syneptody加载规则记录在案 MSDN:除了将模块的目录添加到该搜索路径之外,我认为PSH在这里没有做任何特别的事情。也许跟着一个例子(比如 PSCX)? - Richard
@syneptody从我的用法我有psd1文件中的程序集名称,程序集在脚本的同一目录中,它没有问题。例如 RequiredAssemblies = @('IHE.CDA.Generation.Trifolia') - Tedford


答案:


New-ModuleManifest 它的文档 -RequiredAssemblies 参数同意:

指定模块所需的程序集(.dll)文件。输入程序集文件名。 Windows PowerShell在更新类型或格式,导入嵌套模块或导入RootModule键值中指定的模块文件之前加载指定的程序集。

使用此参数列出模块所需的所有程序集,包括必须加载以更新任何格式的程序集或键入FormatsToProcess或TypesToProcess键中列出的文件

我找不到任何不同的东西(例如 MSDN)。


10
2017-08-28 19:37



您知道如何在此属性中可靠地列出程序集吗?如果我使用完全限定名称并将程序集dll放在模块的文件夹中就足够了,还是需要提供某种路径?装配加载程序在哪里寻找这些装配? - syneptody
@syneptody加载规则记录在案 MSDN:除了将模块的目录添加到该搜索路径之外,我认为PSH在这里没有做任何特别的事情。也许跟着一个例子(比如 PSCX)? - Richard
@syneptody从我的用法我有psd1文件中的程序集名称,程序集在脚本的同一目录中,它没有问题。例如 RequiredAssemblies = @('IHE.CDA.Generation.Trifolia') - Tedford