PowerShell:在加载程序集时创建事件处理程序

时间:2014-01-04 01:48:38

标签: .net events powershell

我很有兴趣在使用Add-Type cmdlet或[System.Reflection.Assembly]::LoadFile()将.NET程序集加载到PowerShell会话时运行一些PowerShell代码。

我没有在.NET Assembly class上看到任何可以让我完成此任务的事件。

我该如何做到这一点?

1 个答案:

答案 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;