WinForms: в накопителе нет диска. пожалуйста, вставьте диск в дисковод - PullRequest
2 голосов
/ 18 октября 2010

У меня есть приложение WinForms. Это записано на диск. Я запускаю приложение с диска и извлекаю диск с CD. Тогда я возьму исключение: в приводе нет диска. пожалуйста, вставьте диск в дисковод. Как я могу поймать это исключение и правильно закрыть свое приложение?

Ответы [ 4 ]

4 голосов
/ 18 октября 2010

Вы должны попытаться обнаружить извлечение диска.Вот пример работы:

3 голосов
/ 18 октября 2010

Это общая проблема с любой программой, не относящейся к приложению Winforms.Это связано с тем, как создается процесс.Windows создает так называемый файл с отображением в памяти, он отображает байты в файле в адресное пространство процесса.Это очень эффективный способ чтения данных из файла, чтение с диска происходит только в том случае, если данные действительно нужны.Когда выполнение программы переходит к определенному фрагменту кода, или JIT-компилятору требуется IL для метода, возникает ошибка страницы, когда данные еще не прочитаны.Операционная система решает это путем чтения фрагмента из файла.Вы платите только за код, который на самом деле выполняется.

Еще одно важное преимущество заключается в том, что система находится под давлением, и для поддержания работы процессов требуется слишком много оперативной памяти.Диспетчер памяти выгружает страницы из ОЗУ, чтобы освободить место для процесса, который требует ЦП.Эти страницы обычно записываются в файл подкачки.Но это не нужно, когда они пришли из EXE-файла.Он может просто отбросить их и всегда получить обратно, перечитав файл.

Возможно, вы увидите, к чему это приводит: загрузка страниц из файла EXE больше не может работать, когда вы вынимаете диск.Windows замечает это и открывает диалог.Это механизм обработки ошибок очень низкого уровня, вы не можете перехватить его в самом процессе.Это не может работать, так как это потребует выполнения кода в вашей программе.Код, который больше не может быть загружен с диска.

Возможно, вы сможете устранить ошибку, введя функцию SetErrorMode ().Не уверен, никогда не пробовал.Но это ничего не решает, следующая лучшая вещь, которая может случиться, - то, что Windows завершает программу с неясной ошибкой.Единственное разумное решение - либо позволить пользователю вернуть диск обратно в соответствии с запросом Windows, либо запустить программу установки с вашего носителя, чтобы на жестком диске была создана копия программы.

2 голосов
/ 18 октября 2010

Используйте EDITBIN / SWAPRUN , чтобы сообщить Windows, что ваш исполняемый файл находится на съемном устройстве.Он скопирует его в файл подкачки перед запуском.

Это то, что вы обычно делаете для (например) установщика.Я не уверен, работает ли это, если вы зависите от других библиотек DLL, но я предполагаю, что это работает.

Для других ресурсов вы бы хотели скопировать их во временное расположение как можно скорее во время инициализации.

Кроме того, вы можете вызвать SetErrorMode, чтобы отключить окно сообщения и правильно обработать ошибку.

0 голосов
/ 18 октября 2010

Вы можете изменить свой Program.cs следующим образом:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        try
        {
            Application.Run(new Form1());
        }
        catch (Exception ex)
        {
            // Display the exception to the end user.
        }
        finally
        {
            // Do your cleanup here.
        }
    }

Это должно перехватывать все исключения, которые вы не перехватываете, в самом приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...