【发布时间】:2019-04-29 15:54:15
【问题描述】:
我在以下代码 sn-p 中收到以下警告,但我不明白为什么
警告 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怎么可能被多次释放呢?
非常感谢。
【问题讨论】:
-
我不是 100%,但我认为你不应该在块内调用
FlushFinalBlock(),使用应该注意我认为 -
昨天是 Raymond Chen 的“旧新事物”:blogs.msdn.microsoft.com/oldnewthing/20181126-00/?p=100325。不是你的情况,确切地说,但是...... Stream API 因 IDisposable 怪异而臭名昭著
-
检查docs.microsoft.com/en-us/dotnet/api/…的最后一个参数-stackoverflow.com/a/50878853/34092(忽略其他答案,阅读我链接的具体答案)。