В прошлом выпуске я поведал вам о выходе в свет книги C#. Советы программистам. Одна из глав книги посвящена различным трюкам, которые можно использовать в IDE Visual Studio. Сегодня узнал еще один интересный прием, который, похоже, не имеется в книге. Суть в следующем. Предположим у вас имеется большой проект. Вы выбираете в редакторе кода какое-нибудь слова и вызываете из контекстного меню команду Go To Definition. Вам мгновенно переносит в нужное место. Все это, безусловно, прекрасно. Но нам нужно вернуться теперь обратно, а проект очень большой... Неужели придется прокручивать редактор в поисках места, с которого вас выбросило? Запомните волшебную комбинацию клавиш Ctrl + -. Как только вы нажмете эту комбинацию, вы снова вернетесь на предыдущую позицию. Строго говоря, эта комбинация в паре с комбинацией Ctrl + Shift + - работает как кнопки Вперед и Назад в Internet Explorer.
Удачного вам программирования!
вторник, 27 мая 2008 г.
суббота, 24 мая 2008 г.
Моя новая книжка C#. Советы программистам
Издательство BHV-Петербург выпустило мою новую книжку C#. Советы программистам. Я постарался отобрать наиболее интересные примеры, которые я использовал в своей практике или собираюсь использовать в будущем. Более полную информацию о книге вы можете почерпуть с моей специальной странички, посвященной книжным новинкам. За написание книги я приступил около двух лет назад. Естественно, часть советов просто не попала в это издание. Поэтому я буду выкладывать новые советы на страницу FAQ. Наиболее интересные решения, возможно, попадут в следующее издании книги. Буду рад, если вы поделитесь своими замечаниями и предложениями по книге. Также можете присылать свои советы, которые я с удовольствием рассмотрю.
Счастливого вам чтения!
Счастливого вам чтения!
воскресенье, 11 мая 2008 г.
Новая книга Защищенный код для Windows Vista
Здравствуйте!
Недавно издательство Питер выпустило книгу Защищенный код для Windows Vista. Книга содержит очень много полезной информации о том, как правильно нужно писать программы под новую операционную систему Windows Vista. Большинство примеров в книге приводится на C++ и только небольшая часть на C#. Но тем не менее, книга очень нужная и своевременная. Я с удовольствием начал ее читать.
Недавно издательство Питер выпустило книгу Защищенный код для Windows Vista. Книга содержит очень много полезной информации о том, как правильно нужно писать программы под новую операционную систему Windows Vista. Большинство примеров в книге приводится на C++ и только небольшая часть на C#. Но тем не менее, книга очень нужная и своевременная. Я с удовольствием начал ее читать.
пятница, 9 мая 2008 г.
Узнать редакцию Vista
В каждой новой операционной системе появляются новые функции. Не стала исключением и Windows Vista. Как вы, вероятно, знаете, Vista поставляется в нескольких редакциях: Home Basic, Home Premium, Business и так далее. Чтобы узнать, какая версия используется у пользователя, можно воспользоваться двумя способами. Первый способ - использовать WMI (свойство OperatingSystemSKU из класса Win32_OperatingSystem). Пример использования этого свойства можно найти в справочнике по WMI.
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:
[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;
int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}
Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:
[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;
int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}
Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!
вторник, 6 мая 2008 г.
Массив байтов и файловые потоки
В одном из проектов мне понадобилось конвертировать массив байтов bytes[] в поток System.IO.Stream. Так как я вплотную потоками не работал, то моя работа затормозилась. Пришлось искать решение в интернете. Оказалось, что мы не одиноки во Вселенной. Одного человека также интересовал этот вопрос, который он задал на форуме ASP.NET Mania. Добрый человек откликнулся на просьбу и предложил решение в виде класса. Я вытащил из кода нужную мне функциональность, но своей странице FAQ оставил оригинальную версию. Вдруг, спустя некоторое время, мне опять понадобится работать с потоками.
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}
public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}
public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!
воскресенье, 27 апреля 2008 г.
Как создавать zip-архивы
Каждое утро на моей работе начинается с одной и той же операции. Необходимо скопировать с сервера пять xls-файлов на свой компьютер и заархивировать их в zip-файлы, чтобы выложить их на ftp-сервер. Раньше эту работу делали вручную, но в конце концов мне надоело выполнять одну и ту же последовательность действий и я решил написать для себя небольшую утилитку. Копирование файлов с одного компьютера на другой не представляет интереса, а вот архивирование файлов в zip-формат оказалось не таким простым делом. Пришлось обратиться к помощи Google, чтобы узнать больше об этой проблеме. После непродолжительных поисков я нашел пять различных способов архивации файлов. Например, можно запустить процесс WinZip c необходимыми параметрами. Но у меня на компьютере нет программы WinZip, поэтому такой способ мне не подходит. Существуют более удобные способы для архивации в виде специальных библиотек. Большинство этих библиотек бесплатны и с открытым исходным кодом. Я протестировал часть самых популярных библиотек в своих примерах и решил остановиться на библиотеке DotNet Zip, которую можно найти по адресу http://www.codeplex.com/DotNetZip.
Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на Ionic.Utils.Zip и написать, например, такой код:
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile(@"c:\photos\cat.jpg");
zip.AddFile(@"c:\Desktop\kitty.jpg");
zip.AddFile("ReadMe.txt");
zip.Save();
}
Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.3 (есть еще бета-версия 1.4).
Сразу оговорюсь, что я не проверял производительность при архивации файлов разными библиотеками, а также не рассматривал их функциональные возможности. Я решал конкретную задачу и данное решение полностью удовлетворило меня. Теперь работа, которая отнимала у меня полчаса драгоценного времени, выполняется в течении минуты. Сейчас я тестирую программу на предмет отправки файлов на ftp-сервер. Но об этом в следующий раз.
А вам удачного программирования!
Христос воскресе!
Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на Ionic.Utils.Zip и написать, например, такой код:
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile(@"c:\photos\cat.jpg");
zip.AddFile(@"c:\Desktop\kitty.jpg");
zip.AddFile("ReadMe.txt");
zip.Save();
}
Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.3 (есть еще бета-версия 1.4).
Сразу оговорюсь, что я не проверял производительность при архивации файлов разными библиотеками, а также не рассматривал их функциональные возможности. Я решал конкретную задачу и данное решение полностью удовлетворило меня. Теперь работа, которая отнимала у меня полчаса драгоценного времени, выполняется в течении минуты. Сейчас я тестирую программу на предмет отправки файлов на ftp-сервер. Но об этом в следующий раз.
А вам удачного программирования!
Христос воскресе!
воскресенье, 20 апреля 2008 г.
SoundPlayer
В .NET Framework 2.0 появилась поддержка звуковых файлов и теперь не нужно прибегать к услугам функций Windows API PlaySound. Для проигрывания звуковых файлов используется класс SoundPlayer из пространства имен System.Media. Приведу небольшой кусок с использованиме этого класса. Более подробно о новых классах вы можете прочитать в документации MSDN или в моем справочнике по .NET Framework.
using System.Media;
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "c:/tada.wav";
player.Play();
Будьте внимательны, поддержка этого класса в .NET Compact Framework доступна только в версии 3.5.
P.S. Кстати, я обзавелся новым электронным адресом klimoff@csfan.ru. CSFAN - это, наверное, фанат C#. Ну что ж, пусть будет еще один адрес. Можете слать на это мыло свои сообщения. Вы также можете приобрести такой адрес, если пройдете на сайт http://www.mailnica.ru/. На этом сайте Майкрософт предлагает на выбор самые разнообразные адреса, например, дочь танкиста.ру или дайте-денег.ру
using System.Media;
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "c:/tada.wav";
player.Play();
Будьте внимательны, поддержка этого класса в .NET Compact Framework доступна только в версии 3.5.
P.S. Кстати, я обзавелся новым электронным адресом klimoff@csfan.ru. CSFAN - это, наверное, фанат C#. Ну что ж, пусть будет еще один адрес. Можете слать на это мыло свои сообщения. Вы также можете приобрести такой адрес, если пройдете на сайт http://www.mailnica.ru/. На этом сайте Майкрософт предлагает на выбор самые разнообразные адреса, например, дочь танкиста.ру или дайте-денег.ру
Подписаться на:
Сообщения (Atom)