我很有兴趣在使用Add-Type
cmdlet或[System.Reflection.Assembly]::LoadFile()
将.NET程序集加载到PowerShell会话时运行一些PowerShell代码。
我没有在.NET Assembly
class上看到任何可以让我完成此任务的事件。
我该如何做到这一点?
答案 0 :(得分:4)
当您将.NET Assembly
加载到PowerShell会话中时,您实际上是将.NET Assembly
加载到所谓的.NET AppDomain
中。每个.NET进程至少有一个AppDomain
,并创建和销毁其他AppDomain
个对象。可以使用AppDomain
在PowerShell中引用默认的[System.AppDomain]::CurrentDomain;
。 AppDomain
静态属性返回的CurrentDomain
实例根据MSDN documentation for the class有一个名为AssemblyLoad
的.NET事件。
您需要做的是订阅“当前”AssemblyLoad
上的AppDomain
事件,并声明您在抛出该事件时要运行的脚本代码。我们通过Register-ObjectEvent
cmdlet执行此操作,该cmdlet允许我们订阅.NET对象上的事件。
# 0. Clean up event subscriptions
Get-EventSubscriber | Unregister-Event;
# 1. Get the current AppDomain
$AppDomain = [System.AppDomain]::CurrentDomain;
# 2. Declare a ScriptBlock that will execute when the event is fired
$Action = { Write-Host -ForegroundColor Green -Object 'Assembly was loaded!'; };
# 3. Register the event subscription
Register-ObjectEvent -InputObject $AppDomain -EventName AssemblyLoad -Action $Action -OutVariable EventSubscription -SourceIdentifier AssemblyLoad;
-SourceIdentifier
参数允许我们为事件订阅指定一个友好名称,以后我们可以通过Get-EventSubscriber
cmdlet来检索它。 -OutVariable
参数是所有PowerShell cmdlet的通用参数,它允许我们定义一个变量名称,该名称将存储从cmdlet生成的所有输出。
以下是在注册事件订阅后检索事件订阅的示例:
Get-EventSubscriber -SourceIdentifier AssemblyLoad;
要取消注册事件订阅,在完成后,只需将事件订阅传递到Unregister-Event
cmdlet,类似于以下示例。
Get-EventSubscriber -SourceIdentifier AssemblyLoad | Unregister-Event;