РЕДАКТИРОВАТЬ: Я обнаружил проблему.
Конструктор для моего объекта инициализировал файловый поток в режиме записи независимо от того, собирались мы зашифровать или расшифровать файл. Несмотря на то, что поток файлов записи будет закрыт перед расшифровкой (другой поток файлов, используемый для этой цели), он все равно вызывает тихий сбой. Теперь работает нормально.
Так что это выглядит довольно обычной проблемой доступа к файлам. Жаль, что CryptoStream
не воспринимает это как исключение.
Спасибо за предложения - я посмотрю на ProcDump и WinDbg .
Я только что создал небольшое приложение для чтения и дешифрования файла с локального жесткого диска.
Отладчик Visual Studio убивает приложение без каких-либо сообщений или объяснений вообще. Это происходит при выполнении строки read = crypto.ReadByte()
в следующем коде.
try
{
if (file != null)
{
// the stream that was used for encryption
file.Close();
}
var provider = new DESCryptoServiceProvider();
provider.Key = Key;
provider.IV = Key;
var ict = provider.CreateDecryptor();
var bytes = new List<byte>();
using (var stream = new FileStream(fileName, FileMode.Open))
{
crypto = new CryptoStream(stream, ict, CryptoStreamMode.Read);
var decrypted = new MemoryStream();
Int32 read;
try
{
do
{
read = crypto.ReadByte(); // the application dies here
if (read != -1) bytes.Add(Convert.ToByte(read));
}
while (read != -1);
}
finally
{
// we never get here
decrypted.Close();
}
};
return ASCIIEncoding.ASCII.GetString(bytes.ToArray());
}
catch (Exception x)
{
// we never get here either
crypto.Close();
return x.Message;
}
То, что я попробовал и исключил:
Нет исключений. Мы никогда не вводим finally
и catch
. Я также включил Break when an exception is thrown
, но это не имеет значения. Нет признаков какого-либо исключения.
Публикация приложения (ClickOnce) и его запуск имеют тот же эффект.
Новый перезапуск не имеет значения.
Создание копии файла (в случае, если какой-то другой процесс блокировал доступ к нему и т. Д.) И попытка прочитать эту копию не удается аналогичным образом.
Если я попытаюсь оценить crypto.ReadByte()
в окне просмотра, я получу следующие сообщения в таком порядке:
This expression causes side effects and will not be evaluated
;
когда я обновляю его: Function evaluation was aborted
когда я обновляю его или просто подожду несколько секунд: Unable to evaluate the expression. The object invoked has disconnected from its clients.
и приложение завершено, мы вернулись в Visual Studio.
В чем здесь проблема?