0

コードでオプション strict ON を設定するために、実際には問題なく動作するコードでエラーが発生します。

    Public Function ModifyRegistryKey(ByVal rClass As String, ByVal rKey As String, ByVal rValName As String, ByVal rValue As String) As Integer

    'Grant Read, Write and Create permissions for the key
    Dim f As New RegistryPermission(RegistryPermissionAccess.Read Or _
                                    RegistryPermissionAccess.Write Or _
                                    RegistryPermissionAccess.Create, rKey)

    Dim regKey As Object
    Try
        'Check if it exists. If it doesn't it will throw an error
        regKey = My.Computer.Registry.CurrentUser.OpenSubKey(rKey, True).GetValue(rValName)
    Catch ex As Exception
        regKey = Nothing
    End Try

    If regKey Is Nothing Then
        'It doesn't exist here. Create the key and set the key name and value.
        regKey = My.Computer.Registry.CurrentUser.CreateSubKey(rKey)

        regKey.SetValue(rValName, rValue) 'LATE BINDING HERE

    Else
        'Registry key exists
        If Not regKey Is rValue Then
            My.Computer.Registry.SetValue(rClass & "\" & rKey, rValName, rValue)
        End If
    End If
End Function

エラー メッセージが表示される理由: 「Option Strict On は遅延バインディングを許可しません。」ここで遅延バインディングを取り除く方法は?

4

1 に答える 1

2

宣言してからメソッドregKey as Objectを呼び出そうとしていますMicrosoft.Win32.RegistryKeyが、コンパイラはそれがタイプになることを知らないと思いMicrosoft.Win32.RegistryKeyます。

余談ですが、例外処理の使用法はベストプラクティスではありません。例外が発生しているのOpenSubKey()は が戻っNothingているためだと思いますが、これは例外ではないので、コード化する必要があります。

より良いと思う例を作成しましたが、コンパイルされます-レジストリを釘付けにしたくないのでテストしていませんが、値を設定する方法が2つある理由がわかりません、だから私はあなたの2番目の方法をコメントアウトしました.レジストリを編集するときに欠けているものかもしれません...

Public Sub ModifyRegistryKey(ByVal rKey As String, ByVal rValName As String, ByVal rValue As String)
    Dim registryKey As Microsoft.Win32.RegistryKey

    registryKey = My.Computer.Registry.CurrentUser.OpenSubKey(rKey, True)

    If registryKey Is Nothing Then
        registryKey = My.Computer.Registry.CurrentUser.CreateSubKey(rKey)
    End If

    If registryKey.GetValue(rValName) Is Nothing _
    OrElse CStr(registryKey.GetValue(rValName)) <> rValue Then
        registryKey.SetValue(rValName, rValue)
        'My.Computer.Registry.SetValue(rClass & "\" & rKey, rValName, rValue)
    End If
End Sub
于 2013-10-18T13:27:23.600 に答える