|
■No83431 (ざっく さん) に返信 > WSH = Nothing COM オブジェクトの即時解放を目的としているのなら、これでは不足です。
VBScript ならば Nothing 代入だけで十分でしたが、 VB.NET では Marshal.ReleaseComObject メソッドを使う必要があります。
> If rc = vbOK Or rc = -1 Then Or 演算子ではなく、OrElse 演算子を使いましょう。
> ただ、このコードはCreateObject("WScript.Shell")を使っているため > option strictでエラーとなってしまいます。 > どうすればエラー無しにすることができますか?
つい先日、 No83366 や No83378 でも同じような事を書きましたが、 Option Strict On で利用するのであれば、 (案1)参照設定して利用する (案2)CallByName で対応する (案3)リフレクションで対応する といった対処になります。
あるいは Partial Class や Partial Method 等を用いて、 Popup メソッドの処理部分のみを、Option Strict Off のファイルに逃がすかですね。
'案1 Dim wshShell As New IWshRuntimeLibrary.WshShell() Dim rc As Integer = wshShell.Popup("シャットダウンしますか?(3分後に自動実行)", 180, "自動シャットダウン", vbOKCancel Or vbQuestion Or vbDefaultButton2) System.Runtime.InteropServices.Marshal.ReleaseComObject(wshShell) If rc = vbOK OrElse rc = -1 Then
'案2 Dim WSH As Object = CreateObject("WScript.Shell") Dim rc As Integer = CInt(CallByName(WSH, "Popup", CallType.Method, "シャットダウンしますか?(3分後に自動実行)", 180, "自動シャットダウン", vbOKCancel Or vbQuestion Or vbDefaultButton2)) System.Runtime.InteropServices.Marshal.ReleaseComObject(WSH) If rc = vbOK OrElse rc = -1 Then
'案3 Dim WSH As Object = CreateObject("WScript.Shell") Dim rc As Integer = CInt(WSH.GetType().InvokeMember( _ "Popup", System.Reflection.BindingFlags.InvokeMethod, Nothing, _ WSH, New Object() { _ "シャットダウンしますか?(3分後に自動実行)", _ 180, _ "自動シャットダウン", _ vbOKCancel Or vbQuestion Or vbDefaultButton2 _ })) System.Runtime.InteropServices.Marshal.ReleaseComObject(WSH) If rc = vbOK OrElse rc = -1 Then
|