Обработка загрузки.net модуля в PowerShell

У меня есть сборка.NET, которая будет импортирована сеансом Powershell с помощью:

Import-Module MyAssemblyFirst.dll

Что мне нужно, это автоматически загрузить другую пользовательскую сборку (MyAssemblySecond.dll) что я знаю о том, когда MyAssemblyFirst.dll импортируется.

Сценарий, который я ищу:

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

но я бы хотел иметь только один Import-Module вызов:

Import-Module MyAssemblyFirst.dll

... и как-то запустить загрузку второй сборки.

2 сборки не ссылаются друг на друга, но я являюсь владельцем обоих. Я просто пытаюсь упростить импорт нескольких сборок, импортируя только одну.

Итак, в более широком примере, я хочу упростить сценарий PS следующим образом:

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

...

Import-Module MyAssemblyNth.dll

в одну строку:

Import-Module MyAssemblyFirst.dll

РЕДАКТИРОВАТЬ: Цель для этого состоит в том, чтобы на основе определенной логики, расположенной в MyAssemblyFirst.dll, я мог бы хотеть автоматически импортировать некоторые другие сборки, которые представляют некоторые новые определенные команды PS.

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
Другие вопросы по тегам