我在下面的代码片段中得到以下警告,但我不明白为什么
警告CA2202: Microsoft.Usage :对象'memStream‘可以在方法'Encrypt(string)’中释放不止一次。为了避免生成System.ObjectDisposedException,您不应该对对象调用Dispose超过一次。
代码:
string Encrypt(string toEncrypt)
{
byte[] key = ...
byte[] iv = ...
using (AesCng aes = new AesCng())
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv))
using (MemoryStream memStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
{
UTF7Encoding encoder = new UTF7Encoding();
byte[] bytes = encoder.GetBytes(toEncrypt);
cryptoStream.Write(bytes, 0, bytes.Length);
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(memStream.ToArray());
}
}据我所知,CryptoStream对象在其本身被释放时不会处理在Stream中传递的内容。那么,如何能够多次释放变量memStream呢?
非常感谢。
发布于 2018-11-27 20:34:39
发布于 2018-11-27 20:42:59
可以使用带有CryptoStream参数的重载leaveOpen构造函数。
不需要这样做,因为CryptoStream对象在使用块时
cryptoStream.FlushFinalBlock();
代码:
string Encrypt(string toEncrypt)
{
byte[] key = ...
byte[] iv = ...
using (AesCng aes = new AesCng())
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv))
using (MemoryStream memStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write,true))
{
UTF7Encoding encoder = new UTF7Encoding();
byte[] bytes = encoder.GetBytes(toEncrypt);
cryptoStream.Write(bytes, 0, bytes.Length);
return Convert.ToBase64String(memStream.ToArray());
}
}leaveOpen:在释放CryptoStream对象时不关闭基础流
https://stackoverflow.com/questions/53507617
复制相似问题