Console.Write ("{0:x2} ", *--pb); // Да здравствует адресная арифметика всех C-подобных языков!!!
}
}
Console.WriteLine("\n"); // Теперь сборщик мусора (если захочет) может заняться массивом , т.к. мы вышли из блока fixed
}
Для проверки приведенного выше опасного кода вставьте в метод TestUnsafe вызов FloatInterior.
FloatInterior (new float[] {1, -1, 1, -1, 1e8f, -1e-8f, 5e6f});
Заметьте, что произвольный массив вещественных чисел создается на лету. Неуемные хакеры заменят (в методе FloatInterior) {1} на {1:x}, так как для них Hexadecimal роднее жены и дороже золота. Если вам важно уметь форматировать в консольных окнах, то приглядитесь внимательно к технике, используемой в этом примере.
By theway: Если опасный код расположен в файле Unsafe.cs и вам хочется компилировать его в режиме командной строки, то необходимо использовать ключ /unsafe. Вот команда запуска компилятора из командной строки.
csc Unsafe.cs /unsafe
Она запускает С-Sharp Compiler (csc) и передает ему файл Unsafe.cs с ключом /unsafe. Команда csc будет доступна в специальном окне Visual Studio Command Prompt. Команду, открывающую это окно, ищите его в меню Пуск→ Microsoft Visual Studio...→ Visual Studio Tools.
Для того, чтобы консольное приложение смогло родить Windows-окно, надо подключить DLL.
· Добавьте в решение MySolution новый проект консольного типа с именем ConsoleWnd,
· Сделайте его стартовым, для этого в контекстном меню проекта выберите SetasStartUpProject.
· В контекстном меню проекта выберите AddReference.
· В диалоге AddReference, выберите 2 библиотеки:System.Drawing и System.Windows.Forms.
· Замените весь код файла.
using System;
using System.Windows.Forms;
namespace ConsoleWnd
{
class Program
{
static void Main()
{
Console.WriteLine("I am ready to serve you");
Form form = new Form();
form.Text = "My Window";
form.Visible = true;
Console.WriteLine("The window width = " + form.Width);
}
}
}
Пожалуйста, не делайте double-click-ов по файлу, так как можно разбудить дизайнер. Он сейчас спит и нам не нужен, он будет работать потом, в Windows-проекте. Запустите приложение и попробуйте объяснить его поведение.
Консольное приложение не создает бесконечного цикла ожидания и обработки сообщений. Поэтому оно сразу завершатся. Оно не ждет реакции пользователя, так как нет цикла типа while (GetMessage(. . .)).
Для того, чтобы задержать окно на экране, вставьте в конец функции Main такую строку кода.
MessageBox.Show ("App has ended");
Запустите и попробуйте объяснить. MessageBox (как и любой другой модальный диалог) содержит внутри себя цикл обработки сообщений, выход из которого происходит только при завершении диалога. Поэтому нам удалось искусственно задержать на этом свете окно Form form. Без цикла типа Message Pump оно хочет умереть.
Для того, чтобы запустить нормальный цикл ожидания и обработки сообщений нужен класс Application. Он может создать цикл и связать его с Windows-окном. Класс Application имеет только статические методы. Их следует вызывать, не создавая объект класса, например, Application.DoEvents(). Вставьте в функцию Main (перед строкой с вызовом MessageBox) такую строку кода.
Application.Run();
Запустите. Приложение повисает. Закройте (только одно Windows-окно) и убедитесь в Task Manager. Почему?
Так как приложение не связано с окном, то окно не может послать ему сообщение WM_QUIT и цикл while (GetMessage())? созданный классом Application не прерывается. Вспомните, что в API-программе оконная процедура, погибая, вызывает PostQuitMessage. Последняя посылает приложению сообщение WM_QUIT и цикл прекращался. В нашем случае для завершения можно нажать Ctrl+С. Это преимущество дает консольный тип проекта. Windows-приложение пришлось бы убивать с помощью Task Manager.
Далее, замените Application.Run(); на Application.Run (form); и запустите. Теперь приложение связано с окном form (которое стало главным окном приложения) и все происходит по привычному сценарию! Профессионалы советуют поиграться с двумя окнами.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.