PowerShell Memo

このサイトはPowerShell(MSH/Monad)奮闘記です

管理人「newpops吉岡洋」が
「PowerShell(旧名:MSH/Monad)」の研究結果を日々綴っていきます。

【お知らせ】
この日記からPowerShellのTipsを抽出し「PowerShell FAQ」として整理しました。


2005-11-24

[]MonadからVB.NETのコードを実行(2)

MonadからVB.NETのコードを実行 - PowerShell Memoでは、

例えば、Beta2のMonadではSTAスレッドで実行が必要なオブジェクトは動作しませんが、

VBCodeProviderを利用してVB.NETのコードを書けば、実現できるわけです。

と書きましたが、その具体例を紹介します。


System.Windows.Forms.ClipboardはSTAスレッドで実行が必要なため、Clipboardを利用してクリップボードにはアクセスできません。

参考:404 Not Found


その解決方法としてNewsGroupで「VBCodeProviderを利用してクリップボードへアクセスするサンプル」が紹介されています。

We are sorry, the page you requested cannot be found


$provider = new-object Microsoft.VisualBasic.VBCodeProvider 
$params = new-object System.CodeDom.Compiler.CompilerParameters 
$params.GenerateInMemory = $True 
$refs = 
"System.dll","Microsoft.VisualBasic.dll","System.Data.DLL", `
"System.management.dll","System.DirectoryServices.dll" 
$params.ReferencedAssemblies.AddRange($refs) 

# VB.NET EXAMPLE 
$txtCode = @' 

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Threading 

Public Class mow 

Sub Main() 
Dim newThread As Thread = New Thread(AddressOf ThreadMethod) 
newThread.ApartmentState = ApartmentState.STA 
newThread.Start() 
End Sub 

Shared Sub ThreadMethod() 
dim Comp as new Microsoft.VisualBasic.Devices.computer 
comp.clipboard.setText("hello Clip") 
End Sub 

End Class 


'@ 

$results = $provider.CompileAssemblyFromSource($params, $txtCode) 
$mAssembly = $results.CompiledAssembly 
$i = $mAssembly.CreateInstance("mow") 
$r = $i.main() 

また、上記サンプル作者のページでは、ClipboardクラスをSTAスレッドで利用するようにラップしたDLLを通して、MSHからクリップボードを操作する方法も紹介されています。

/¥/¥o¥/¥/ PowerShelled: MSH Clipboard part 2 (of 3 ?)