CA2202, как решить этот случай - PullRequest
98 голосов
/ 30 сентября 2010

Может кто-нибудь сказать мне, как удалить все предупреждения CA2202 из следующего кода?

public static byte[] Encrypt(string data, byte[] key, byte[] iv)
{
    using(MemoryStream memoryStream = new MemoryStream())
    {
        using (DESCryptoServiceProvider cryptograph = new DESCryptoServiceProvider())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                using(StreamWriter streamWriter = new StreamWriter(cryptoStream))
                {
                    streamWriter.Write(data);
                }
            }
        }
        return memoryStream.ToArray();
    }
}

Предупреждение 7 CA2202: Microsoft.Usage: объект 'cryptoStream' может быть размещен более одного раза в методе 'CryptoServices.Encrypt (string, byte [], byte [])'.Чтобы избежать генерирования исключения System.ObjectDisposedException, не следует вызывать метод Dispose для объекта более одного раза .: Строки: 34

Предупреждение. 8 CA2202: Microsoft.Usage: объект 'memoryStream' может быть удален более одного раза в методе.'CryptoServices.Encrypt (string, byte [], byte [])'.Во избежание генерации исключения System.ObjectDisposedException не следует вызывать метод Dispose для объекта более одного раза .: строки: 34, 37

. Для просмотра этих предупреждений необходим анализ кода Visual Studio (это не c #предупреждения компилятора).

Ответы [ 12 ]

0 голосов
/ 30 сентября 2010

Я использовал такой код, который принимает byte [] и возвращает byte [] без использования потоков

public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
  DES des = new DES();
  des.BlockSize = 128;
  des.Mode = CipherMode.CBC;
  des.Padding = PaddingMode.Zeros;
  des.IV = IV
  des.Key = key
  ICryptoTransform encryptor = des.CreateEncryptor();

  //and finaly operations on bytes[] insted of streams
  return encryptor.TransformFinalBlock(plaintextarray,0,plaintextarray.Length);
}

Таким образом, все, что вам нужно сделать, это преобразовать строку в байт [] с использованием кодировок.

0 голосов
/ 30 сентября 2010

Не по теме, но я бы предложил вам использовать другую технику форматирования для группировки using s:

using (var memoryStream = new MemoryStream())
{
    using (var cryptograph = new DESCryptoServiceProvider())
    using (var encryptor = cryptograph.CreateEncryptor(key, iv))
    using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
    using (var streamWriter = new StreamWriter(cryptoStream))
    {
        streamWriter.Write(data);
    }

    return memoryStream.ToArray();
}

Я также рекомендую использовать здесь var s, чтобы избежать повторений действительно длинных имен классов.

PS Спасибо @ShellShock за то, что я указал, что я не могу опустить фигурные скобки для первого using, так как это сделает memoryStream в return выражении вне области действия.

...