gpt4 book ai didi

c# - CryptoStream 可以让基本 Stream 保持打开状态吗?

转载 作者:IT王子 更新时间:2023-10-29 04:33:30 31 4
gpt4 key购买 nike

我创建了一个MemoryStream,将它传递给CryptoStream 进行写入。我希望 CryptoStream 进行加密,并让 MemoryStream 保持打开状态以便我读取其他内容。但是一旦 CryptoStream 被释放,它也会释放 MemoryStream

CryptoStream 能否以某种方式打开基础 MemoryStream

using (MemoryStream scratch = new MemoryStream())
{
using (AesManaged aes = new AesManaged())
{
// <snip>
// Set some aes parameters, including Key, IV, etc.
// </snip>
ICryptoTransform encryptor = aes.CreateEncryptor();
using (CryptoStream myCryptoStream = new CryptoStream(scratch, encryptor, CryptoStreamMode.Write))
{
myCryptoStream.Write(someByteArray, 0, someByteArray.Length);
}
}
// Here, I'm still within the MemoryStream block, so I expect
// MemoryStream to still be usable.
scratch.Position = 0; // Throws ObjectDisposedException
byte[] scratchBytes = new byte[scratch.Length];
scratch.Read(scratchBytes,0,scratchBytes.Length);
return Convert.ToBase64String(scratchBytes);
}

最佳答案

从 .NET 4.7.2 开始,有第二个构造函数,其中添加了一个名为 leaveOpen 的 bool 参数。如果将其设置为 true,则 CryptoStream 的 dispose 方法将不会在基础流上调用 dispose。

Additionally ,另一个没有 leaveOpen 参数的构造函数只是将参数转发给 leaveOpen 设置为 false 的新构造函数。

MSDN MS Learn
CryptoStream.Dispose(bool disposing)

此构造函数在 .NET Standard 2.0 中不存在,但可以使用反射设置基础字段(感谢@StuartLC 在评论中链接 this answer):

using CryptoStream s = new(scratch, encryptor, CryptoStreamMode.Write)
var prop = s.GetType().GetField("leaveOpen", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
prop.SetValue(s, true);

这是一个肮脏的解决方法,我不会推荐它,除非你知道你的软件将在其上运行的系统安装了相关版本的 .NET。

关于c# - CryptoStream 可以让基本 Stream 保持打开状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19736631/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com