2016-07-02 10 views
-1

Was mit dem folgenden code..The gegebenen Code falsch ist, ist nicht Beschwerde bei CA2000: Objekten entsorgen, bevor Umfang verlieren (https://msdn.microsoft.com/library/ms182289.aspx) .. Dieser Code erzeugen die folgende Warnung.NET-Code-Analyse Warnung

Warnung CA2000 In Methode 'CryptoComputer.Encrypt (String, String, String, String)', das Objekt 'new RijndaelManaged()' ist nicht in allen Ausnahmepfaden enthalten. Rufen Sie System.IDisposable.Dispose für das Objekt 'new RijndaelManaged()' auf, bevor alle Verweise darauf den Gültigkeitsbereich verlassen.

public static string Encrypt(string plainText, string passPhrase, string saltValue, string initVector) 
      { 
       var initVectorBytes = Encoding.UTF8.GetBytes(initVector); 
       var saltValueBytes = Encoding.UTF8.GetBytes(saltValue); 
       var plainTextBytes = Encoding.UTF8.GetBytes(plainText); 
       string cipherText; 
       PasswordDeriveBytes password = null; 
       RijndaelManaged symmetricKey = null; 
       MemoryStream memoryStream = null; 
       try 
       { 
        memoryStream = new MemoryStream(); 

        password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations); 
        byte[] keyBytes = password.GetBytes(keySize/8); 

        symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC }; 
        var encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 

        var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 

        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 

        cryptoStream.FlushFinalBlock(); 

        var cipherTextBytes = memoryStream.ToArray(); 


        cipherText = Convert.ToBase64String(cipherTextBytes); 

       } 
       catch (Exception) 
       { 

        throw; 
       } 
       finally 
       { 
        password?.Dispose(); 
        symmetricKey?.Dispose(); 
        memoryStream?.Dispose(); 

       } 

       return cipherText; 
      } 

Wie kann ich diesen Code neu schreiben die Microsoft-Richtlinien

+0

Use "mit (...)" für Passwort, SymmetricKey, Memorystream. –

+1

Oder liegt es daran, dass die Analyseschemas von Microsoft die Syntax "password? .Dispose()" nicht erkennen? Was, wenn Sie es als 'if (obj! = Null) umschreiben obj.Dispose();'? – kennyzx

+0

Kennyzx ist wahrscheinlich richtig ... Sie müssen den Code auf die alte Art schreiben oder die falsche Warnung unterdrücken –

Antwort

0

Wickeln Sie es mit einem Using { ... } Block wie unten gerecht zu werden, die sicherstellen, dass die Einweg-Instanz entsorgt wird, sobald es den Gültigkeitsbereich verlässt. Stellen Sie sicher, dass Sie alle verfügbaren Objekte in einen using {} Block und nicht nur den unten gezeigten einpacken.

using (symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC }) 
{ 
    //rest code goes here 
} 
+0

nein es ist nicht woking –

+0

@BinsonEldhose, habe dir den Weg gezeigt. Wie ich bereits erwähnt habe, müssen Sie alle verfügbaren Objekte in einen 'using {}' -Block einbinden, nicht nur den, den Sie in der Antwort erwähnt haben. – Rahul

1

Jedes Einweg-Objekt in "mit (...)":

... 
var initVectorBytes = Encoding.UTF8.GetBytes(initVector); 
var saltValueBytes = Encoding.UTF8.GetBytes(saltValue); 
var plainTextBytes = Encoding.UTF8.GetBytes(plainText); 
string cipherText; 
using (var memoryStream = new MemoryStream()) 
{ 
    using (var password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations)) 
    { 
    var keyBytes = password.GetBytes(keySize/8); 
    using (var symmetricKey = new RijndaelManaged {Mode = CipherMode.CBC}) 
    { 
     var encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 
     var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 
     cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     var cipherTextBytes = memoryStream.ToArray(); 
     cipherText = Convert.ToBase64String(cipherTextBytes); 
    } 
    } 
} 
return cipherText; 
... 

using Statement (C# Reference)