CA2000:对象未沿所有异常路径放置

时间:2011-08-23 18:25:26

标签: asp.net vb.net code-analysis idisposable

我无法弄清楚为什么我会在下面的代码中收到此警告。

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 个答案:

答案 0 :(得分:1)

由于您在Try ... Finally块之外声明(并实例化)des对象,因此您的代码可能会在Dim ms As New MemoryStream()和.Dispose()行中引发异常。不会被叫。

当您使用实现IDisposable的对象时,最好尽可能将它们包装在Using块而不是Try ... Finally块中。例如:

Public Function Decrypt(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 

答案 1 :(得分:0)

只是一个猜测,但也许它不够聪明,没有意识到这个代码行将永远是真的:

If des IsNot Nothing Then

换句话说,它可能会假设因为存在条件语句,可能不会执行Dispose()调用。

要检查,您可以尝试注释掉“if”并查看警告是否消失。