24

を作成し、書き込み用MemoryStreamに渡します。暗号化して、他のものに読み込むために開いたままにしておきますCryptoStream。しかし、処分されるとすぐに、それも処分されます。CryptoStreamMemoryStreamCryptoStreamMemoryStream

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);
}
4

5 に答える 5

15

2 番目の解決策として、Dispose / Close を除くすべての呼び出しを単純に渡す WrapperStream オブジェクトを作成できます。メモリ ストリームのラッパーを作成し、そのラッパーを暗号ストリームに渡します。暗号ストリームを閉じても、メモリ ストリームには影響しません。

于 2013-11-02T15:39:41.483 に答える
5

結局のところ、using {} ブロックを try{}finally{} に分割する必要はありません。最終的には、using ステートメント内で FlushFinalBlock() を使用し、その中に他のものを次のようにネストするだけです。必要。

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);
            myCryptoStream.FlushFinalBlock();
            scratch.Flush();   // not sure if this is necessary
            byte[] scratchBytes = scratch.ToArray();
            return Convert.ToBase64String(scratchBytes);
        }
    }
}
于 2013-11-02T14:14:51.940 に答える