Asp.net CA2000:对象未沿所有异常路径释放

Asp.net CA2000:对象未沿所有异常路径释放,asp.net,vb.net,code-analysis,idisposable,Asp.net,Vb.net,Code Analysis,Idisposable,我在试图找出为什么我在下面的代码中得到这个警告时遇到了困难 CA2000:Microsoft。可靠性:在方法“Encryption64.Decrypt(String,String)”中,对象“des”未沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.Dispose CA2000:Microsoft。可靠性:在方法“Encryption64.Encrypt(String,String)”中,对象“des”不会沿所有异常路径释放。在对象“d

我在试图找出为什么我在下面的代码中得到这个警告时遇到了困难

CA2000:Microsoft。可靠性:在方法“Encryption64.Decrypt(String,String)”中,对象“des”未沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.Dispose

CA2000:Microsoft。可靠性:在方法“Encryption64.Encrypt(String,String)”中,对象“des”不会沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.Dispose


只是一个猜测,但也许它还不够聪明,无法意识到这一代码行永远是正确的:

If des IsNot Nothing Then
换句话说,它可能假设由于存在条件语句,
Dispose()
调用可能不会执行

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

因为您正在try之外声明(并实例化)des对象。。。最后,您的代码可能会在Dim ms行中引发异常,因为New MemoryStream()和您的.Dispose()将不会被调用

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

公共函数解密(ByVal stringToDecrypt As String,ByVal sEncryptionKey As String)为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 

不太好,没用。我还怀疑“Dim cs As New CryptoStream…”行可能会抛出一个异常,在这种情况下des不会被处置。所以我试着再做一次尝试…抓住…最后,对于那些台词,它仍然给出了相同的警告。谢谢,这没有任何问题!只是出于好奇,使用是否为我们自动处理?我写.Net代码已经有相当一段时间了,但从来没有真正关心过代码分析/优化。是的。在VB8(2003)中引入了Using,并为您处理对包装对象的Dispose调用。
    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