Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I add an event handler to a .NET object in PowerShell?

Tags:

powershell

I'm writing a PowerShell script which uses a third-party library. One of the objects I'm using requires that I add an event handler. The event delegate looks like this:

public delegate void TSBPGPCreateOutputStreamEvent(object Sender, 
                                                   string Filename, 
                                                   System.DateTime TimeStamp, 
                                                   ref System.IO.Stream Stream, 
                                                   ref bool FreeOnExit)

In PowerShell, I tried doing this:

$reader.Add_OnCreateOutputStream( {
    param(
        $sender,
        $fileName,
        $timestamp,
        [ref]
        $stream,
        [ref]
        $freeOnExit
    )
    $stream = New-Object IO.MemoryStream
} )

But I get back this error message:

 Cannot convert value "
    param(
        $sender,
        $fileName,
        $timestamp,
        [ref]
        $stream,
        [ref]
        $freeOnExit
    )
$stream = New-Object IO.MemoryStream
" to type "SBPGP.TSBPGPCreateOutputStreamEvent". 
Error: "The type 'System.IO.Stream&' may not be used as a type argument."

Is there a better way of subscribing to events? Why can't the Stream type be used as a type argument? What am I doing wrong?

like image 367
Aaron Jensen Avatar asked Aug 09 '12 16:08

Aaron Jensen


2 Answers

You should use the Register-ObjectEvent cmdlet, take a look at the examples on your own system by using:

PS> Get-Help Register-ObjectEvent -full
like image 118
Bas Bossink Avatar answered Sep 20 '22 22:09

Bas Bossink


Add-Type -AssemblyName System.Windows.Forms
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
$form = New-Object Windows.Forms.Form
$form.add_mousedown($handler_form_mousedown)
$handler_form_Mousedown=
{
param([object]$sender, [System.EventArgs]$e)
write-host $e.x
write-host $e.y
$sender.text="if ya think your so noble answer the question"
$sender.text = "Nobles Oblige"
# PS HELP IS USELESS FOR THIS    
}

$App = $form.ShowDialog()
like image 38
laddie Avatar answered Sep 22 '22 22:09

laddie