Обработка загрузки.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