0

我有一个 .NET 程序集,它将由 Powershell 会话使用:

Import-Module MyAssemblyFirst.dll

我需要的是自动加载另一个MyAssemblySecond.dll我知道何时MyAssemblyFirst.dll导入的自定义程序集 ()。

我正在寻找的场景是:

Import-Module MyAssemblyFirst.dll
Import-Module MyAssemblySecond.dll

但我宁愿只打一个Import-Module电话:

Import-Module MyAssemblyFirst.dll

...并以某种方式触发加载第二个程序集。

这两个程序集不相互引用,但我是两者的所有者。我只是想通过只导入一个来简化导入多个程序集。

所以在一个更广泛的例子中,我希望像这样简化一个 PS 脚本:

Import-Module MyAssemblyFirst.dll
Import-Module MyAssemblySecond.dll
Import-Module MyAssemblyThird.dll

...

Import-Module MyAssemblyNth.dll

到单行:

Import-Module MyAssemblyFirst.dll

编辑: 这样做的目的是基于位于 MyAssemblyFirst.dll 中的某个逻辑,我可能希望自动导入一些其他程序集,这些程序集会公开一些新的特定 PS 命令。

4

1 回答 1

1

您可以实现IModuleAssemblyInitializer接口以提供模块初始化代码:

Add-Type -TypeDefinition @‘
    using System;
    using System.Management.Automation;
    [Cmdlet(VerbsLifecycle.Invoke, "Command1")]
    public class Command1 : Cmdlet {
        protected override void ProcessRecord() {
            WriteObject("Command 1");
        }
    }
    public class ModuleInitializer : IModuleAssemblyInitializer {
        public void OnImport() {
            using(PowerShell ps = PowerShell.Create(RunspaceMode.CurrentRunspace)) {
                ps.AddCommand("Write-Host").AddArgument("Before submodule import").AddStatement().
                   AddCommand("Import-Module").AddArgument(".\\Assembly2.dll").AddStatement().
                   AddCommand("Write-Host").AddArgument("After submodule import").Invoke();
            }
        }
    }
’@ -OutputAssembly .\Assembly1.dll

Add-Type -TypeDefinition @‘
    using System;
    using System.Management.Automation;
    [Cmdlet(VerbsLifecycle.Invoke, "Command2")]
    public class Command2 : Cmdlet {
        protected override void ProcessRecord() {
            WriteObject("Command 2");
        }
    }
    public class ModuleInitializer : IModuleAssemblyInitializer {
        public void OnImport() {
            using(PowerShell ps = PowerShell.Create(RunspaceMode.CurrentRunspace)) {
                ps.AddCommand("Write-Host").AddArgument("Importing submodule").Invoke();
            }
        }
    }
’@ -OutputAssembly .\Assembly2.dll

Write-Host 'Before module import'
Import-Module .\Assembly1.dll
Write-Host 'After module import'

Invoke-Command2
于 2016-07-11T21:23:59.040 回答