CA2000: объект расположен не по всем путям исключений - PullRequest
0 голосов
/ 23 августа 2011

У меня проблемы с попыткой выяснить, почему я получаю это предупреждение в следующем коде.

CA2000: Microsoft.Reliability: В методе 'Encryption64.Decrypt (String, String)' объект 'des' расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта 'des' до того, как все ссылки на него выйдут из области видимости.

CA2000: Microsoft.Reliability: В методе 'Encryption64.Encrypt (String, String)' объект 'des' расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта 'des' до того, как все ссылки на него выйдут из области видимости.

Public Class Encryption64

    Private key() As Byte = {}
    Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}

    Public Function Decrypt(ByVal stringToDecrypt As String, ByVal sEncryptionKey As String) As String

        Dim des As New DESCryptoServiceProvider()
        Dim ms As New MemoryStream()
        Dim ReturnValue As String = String.Empty

        Try

            Dim inputByteArray(stringToDecrypt.Length) As Byte
            key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
            inputByteArray = Convert.FromBase64String(stringToDecrypt)

            Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV),CryptoStreamMode.Write)
            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()

            Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
            ReturnValue = encoding.GetString(ms.ToArray())

        Catch e As Exception

            ReturnValue = e.Message

        Finally

            If des IsNot Nothing Then
                des.Dispose()
            End If

            If ms IsNot Nothing Then
                ms.Dispose()
            End If

        End Try

        Return ReturnValue

    End Function

    Public Function Encrypt(ByVal stringToEncrypt As String, ByVal SEncryptionKey As String) As String

        Dim des As New DESCryptoServiceProvider()
        Dim ms As New MemoryStream()
        Dim ReturnValue As String = String.Empty

        Try

            key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))

            Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt)
            Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write)

            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()

            ReturnValue = Convert.ToBase64String(ms.ToArray())

        Catch e As Exception

            ReturnValue = e.Message

        Finally

            If des IsNot Nothing Then
                des.Dispose()
            End If

            If ms IsNot Nothing Then
                ms.Dispose()
            End If

        End Try

        Return ReturnValue

    End Function

End Class

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Поскольку вы объявляете (и создаете экземпляры) свои объекты des вне блоков Try ... finally, ваш код может вызвать исключение в строке Dim ms As New MemoryStream () и вашем .Dispose ()не будет называться.

Когда вы работаете с объектами, которые реализуют IDisposable, гораздо предпочтительнее, когда это возможно, оборачивать их в блок Using вместо блока Try ... finally.Например:

Открытая функция расшифровывается (ByVal stringToDecrypt As String, ByVal sEncryptionKey As String) As String

    Dim ms As New MemoryStream() 
    Dim ReturnValue As String = String.Empty 

        Dim inputByteArray(stringToDecrypt.Length) As Byte 
        key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8)) 
        inputByteArray = Convert.FromBase64String(stringToDecrypt) 

        Using ms as New MemoryStream
           Using des As New DESCryptoServiceProvider
              Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV),CryptoStreamMode.Write) 
              cs.Write(inputByteArray, 0, inputByteArray.Length) 
              cs.FlushFinalBlock() 
           End Using ' des
           Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8 
           ReturnValue = encoding.GetString(ms.ToArray()) 
        End Using ' ms 
    Catch e As Exception 

        ReturnValue = e.Message 

    End Try 

    Return ReturnValue 

End Function 
0 голосов
/ 23 августа 2011

Просто предположение, но, возможно, он недостаточно умен, чтобы понять, что эта строка кода всегда будет верна:

If des IsNot Nothing Then

Другими словами, можно предположить, что из-за условного оператора вызов Dispose() может не выполняться.

Чтобы проверить, вы можете попробовать закомментировать «если» и посмотреть, исчезнет ли предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...