{"id":10591,"date":"2006-04-25T12:18:15","date_gmt":"2006-04-25T12:18:15","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/powershell\/2006\/04\/25\/invoking-scriptblocks-from-c\/"},"modified":"2019-02-18T13:24:55","modified_gmt":"2019-02-18T20:24:55","slug":"invoking-scriptblocks-from-c","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/invoking-scriptblocks-from-c\/","title":{"rendered":"Invoking Scriptblocks from C#"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>Last time somebody asked for an example of a C# method that took a scriptblock.<span>&nbsp; <\/span>First of all, there\u2019s one very important thing you have to know about scriptblocks as they are currently implemented.<span>&nbsp; <\/span>They can\u2019t be invoked outside of a runspace.<span>&nbsp; <\/span>Any attempt to do so will result in an exception.<span>&nbsp; <\/span>Some of you may already have found this out when using scriptblocks as delegates.<span>&nbsp; <\/span>Here\u2019s a quick demonstration of what happens when you try it:<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>static<\/span><\/font> <font color=\"blue\"><span>void<\/span><\/font> Main(<font color=\"blue\"><span>string<\/span><\/font>[] args)<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>try<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>RunspaceInvoke<\/span><\/font> invoke = <font color=\"blue\"><span>new<\/span><\/font> <font color=\"teal\"><span>RunspaceInvoke<\/span><\/font>();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>ScriptBlock<\/span><\/font> scriptblock = invoke.Invoke(<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><font color=\"maroon\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;{ return &#8216;foo&#8217;; }&#8221;<\/span><\/font>)[0].BaseObject <font color=\"blue\"><span>as<\/span><\/font> <font color=\"teal\"><span>ScriptBlock<\/span><\/font>;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>scriptblock.Invoke();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>catch<\/span><\/font> (<font color=\"teal\"><span>Exception<\/span><\/font> e)<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><font color=\"teal\"><span>Console<\/span><\/font>.WriteLine(e);<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>finally<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.WriteLine(<font color=\"maroon\"><span>&#8220;Press any key to exit&#8230;&#8221;<\/span><\/font>);<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.ReadKey();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>Which results in the following exception message\u2026<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">System.Management.Automation.MshInvalidOperationException: A script block delega<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">te was invoked from the wrong thread. It is permitted to pass a script block as<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">a delegate, but the delegate may only be invoked from a runspace thread. The scr<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">ipt block you attempted to invoke was: return &#8216;foo&#8217;;<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;&nbsp; <\/span>at System.Management.Automation.ScriptBlock.UpdateUsingInfoFromTLS()<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;&nbsp; <\/span>at System.Management.Automation.ScriptBlock.InvokeWithPipe(Boolean UseLocalSc<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">ope, Boolean writeErrors, Object dollarUnder, Object input, Object scriptThis, P<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">ipe outputPipe, ArrayList&amp; resultList, Object[] args)<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;&nbsp; <\/span>at System.Management.Automation.ScriptBlock.Invoke(Object dollarUnder, Object<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;<\/span>input, Object[] args)<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;&nbsp; <\/span>at System.Management.Automation.ScriptBlock.Invoke(Object[] args)<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\"><span>&nbsp;&nbsp; <\/span>at Test.Program.Main(String[] args) in c:\\Temp\\ConsoleApplication15\\Program.c<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">s:line 23<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font><font color=\"#006400\">Press any key to exit&#8230;<\/font><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>So\u2026 creating scriptblocks and taking them out of the runspace for invocation is out of the question for now\u2026<span>&nbsp; <\/span>You could of course send the scriptblock back into a runspace and invoke it there.<span>&nbsp; <\/span>Lets try that, and just for fun we\u2019ll invoke the scriptblock in a different runspace than the one it was created in:<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>RunspaceInvoke<\/span><\/font> invoke = <font color=\"blue\"><span>new<\/span><\/font> <font color=\"teal\"><span>RunspaceInvoke<\/span><\/font>();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>ScriptBlock<\/span><\/font> scriptblock = invoke.Invoke(<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><font color=\"maroon\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;{ return &#8216;foo&#8217;; }&#8221;<\/span><\/font>)[0].BaseObject <font color=\"blue\"><span>as<\/span><\/font> <font color=\"teal\"><span>ScriptBlock<\/span><\/font>;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"green\"><span>\/\/A second runspace.<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>RunspaceInvoke<\/span><\/font> mySecondInvoke = <font color=\"blue\"><span>new<\/span><\/font> <font color=\"teal\"><span>RunspaceInvoke<\/span><\/font>();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Collection<\/span><\/font>&lt;<font color=\"teal\"><span>MshObject<\/span><\/font>&gt; results = mySecondInvoke.Invoke<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<font color=\"maroon\"><span>&#8220;$script = $input | write-object; &amp; $script&#8221;<\/span><\/font>,<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><\/span><\/font><font face=\"Courier New\" size=\"2\"><span><font color=\"blue\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new<\/span><\/font> <font color=\"blue\"><span>object<\/span><\/font>[] { scriptblock });<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>string<\/span><\/font> resultStr = results[0].BaseObject.ToString();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.WriteLine(resultStr);<\/span><\/font><font face=\"Arial\" size=\"2\"><span><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>Which results in:<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font color=\"#006400\">foo<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span><font color=\"#006400\">Press any key to exit&#8230;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>So grabbing a scriptblock from one runspace and sending it across to another runspace works.<span>&nbsp; <\/span>When doing this you should always keep in mind that these are different runspaces with different SessionState so variables, providers and cmdlets that exist in one runspace might not exist in the other.<span>&nbsp; <\/span>It all depends, of course, on how you created the runspace and what you\u2019ve run after it was created.<span>&nbsp; <\/span>Anyway, getting back to the original subject, what we really wanted was an example of a C# method that takes a scriptblock.<span>&nbsp; <\/span>Well\u2026 while you can\u2019t invoke a scriptblock outside of the runspace thread, you CAN call C# methods from Monad.<span>&nbsp; <\/span>And if you call a C# method from Monad, it gets invoked on the runspace thread.<span>&nbsp; <\/span>So\u2026. to try this out, the first thing we need is a method that takes a ScriptBlock.<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>public<\/span><\/font> <font color=\"blue\"><span>static<\/span><\/font> <font color=\"blue\"><span>string<\/span><\/font> MyTestMethod(<font color=\"teal\"><span>ScriptBlock<\/span><\/font> scriptBlock)<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>return<\/span><\/font> scriptBlock.Invoke(<font color=\"maroon\"><span>&#8220;foobar&#8221;<\/span><\/font>)[0].ToString();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>Now\u2026 all we need to do is invoke this static method and get the results.<span>&nbsp; <\/span>A slight modification of our earlier program will do the trick.<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>static<\/span><\/font> <font color=\"blue\"><span>void<\/span><\/font> Main(<font color=\"blue\"><span>string<\/span><\/font>[] args)<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>try<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>RunspaceInvoke<\/span><\/font> ri = <font color=\"blue\"><span>new<\/span><\/font> <font color=\"teal\"><span>RunspaceInvoke<\/span><\/font>();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"green\"><span>\/\/ Create a scriptblock and pass it to our <\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><font color=\"green\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ static method.<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>string<\/span><\/font> script = <\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"maroon\"><span>&#8220;$script = { return $args; }<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>\\r\\n&#8221;<\/span><\/font> +<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"maroon\"><span>&#8220;[Test.Program]::MyTestMethod($script);<span>&nbsp;&nbsp; <\/span>\\r\\n&#8221;<\/span><\/font>;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>string<\/span><\/font> scriptBlockResult = ri.Invoke(script)<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0].ToString();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.WriteLine(scriptBlockResult);<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"blue\"><span>finally<\/span><\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.WriteLine(<font color=\"maroon\"><span>&#8220;Press any key to exit&#8230;&#8221;<\/span><\/font>);<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font color=\"teal\"><span>Console<\/span><\/font>.ReadKey();<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>The script we are running is fairly simple.<span>&nbsp; <\/span>First it creates a scriptblock and assigns it to a variable.<span>&nbsp; <\/span>Then it calls the static method MyTestMethod on class Test.Program, passing it the scriptblock as an argument.<span>&nbsp; <\/span>If you compile and run this you\u2019ll get the following output:<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><font color=\"#006400\">foobar<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span><font color=\"#006400\">Press any key to exit&#8230;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Arial\" size=\"2\"><span>&#8211; Marcel<\/span><\/font><\/p>\n<p>[<i>Edit: Monad has now been renamed to Windows PowerShell.  This script or discussion may require slight adjustments before it applies directly to newer builds.<\/i>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last time somebody asked for an example of a C# method that took a scriptblock.&nbsp; First of all, there\u2019s one very important thing you have to know about scriptblocks as they are currently implemented.&nbsp; They can\u2019t be invoked outside of a runspace.&nbsp; Any attempt to do so will result in an exception.&nbsp; Some of you [&hellip;]<\/p>\n","protected":false},"author":600,"featured_media":13641,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-10591","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell"],"acf":[],"blog_post_summary":"<p>Last time somebody asked for an example of a C# method that took a scriptblock.&nbsp; First of all, there\u2019s one very important thing you have to know about scriptblocks as they are currently implemented.&nbsp; They can\u2019t be invoked outside of a runspace.&nbsp; Any attempt to do so will result in an exception.&nbsp; Some of you [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/10591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/users\/600"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/comments?post=10591"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/10591\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media\/13641"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media?parent=10591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=10591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=10591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}