【问题标题】:How to reliably reference external .NET assemblies in a PowerShell v3 module?如何在 PowerShell v3 模块中可靠地引用外部 .NET 程序集?
【发布时间】:2013-08-28 19:28:11
【问题描述】:

我正在开发一个 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 方法让它工作......我正在寻找最可靠的方法的指导和建议.

【问题讨论】:

    标签: powershell powershell-3.0 powershell-module


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您知道如何可靠地列出此属性中的程序集吗?如果我使用完全限定名称并将程序集 dll 放在模块的文件夹中就足够了,还是我需要提供某种路径?程序集加载器在哪里寻找这些程序集?
    • @syneptody 加载规则记录在MSDN 上:除了将模块目录添加到该搜索路径之外,我认为 PSH 在这里没有做任何特别的事情。也许跟随一个例子(比如PSCX)?
    • @syneptody 根据我的使用情况,我在 psd1 文件中有程序集名称,该程序集位于脚本的同一目录中,并且可以正常工作。例如RequiredAssemblies = @('IHE.CDA.Generation.Trifolia')
    • 把dll文件放在同一个目录下可以省心。从组织上讲,可能值得将它们放在其中的子目录中吗?像./bin ??有什么缺点吗?
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2011-01-08
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多