Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В двадцать восьмом выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов, разработанных с использованием платформы .Net, узнать, что должен знать программист ASP.NET о доменах приложения,


Информационный Канал Subscribe.Ru

.Net Собеседник #28

Содержание
  1. От автора
  2. Обзор новостей
  3. Что должен знать программист ASP.NET о доменах приложения  
  4. Время кода - Раскладка клавиатуры и выбор языка
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Каким образом можно получить список логических дисков в системе на C#? Да очень просто:

using System;
namespace hDrummer.LogicalDrives
{

class LogicalDrives
{

[STAThread]
static void Main(string[] args)
{
string[] LogicalDrives = Environment.GetLogicalDrives();
foreach(string s in LogicalDrives)
{
Console.WriteLine(s);
}
}}}
//Вывод на экране -
//A:\
//C:\
//D:\
//E:\

На этом всё - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Вышел JNBridgePro 2.2 – решение для взаимодействия Java/.NET
    JNBridge выпустила JNBridgePro 2.2, последнюю версию для взаимодействия Java/.NET платформ. Бесплатная, полнофункциональная версия с ограничением по времени использования доступна по адресу www.jnbridge.com.
  2. Вышел ASP Painter .NET 2.0
    ASPPainter .NET может быть использован для создания новых и редактирования существующих рисунков. Компонент работает с несколькими изображениями одновременно. Полный исходный код доступен для разработчиков.
  3. Особенности ReSharper IDE
    JetBrains, Inc. собирает информацию от членов сообщества .NET о функциональности, которую они хотели бы видеть в следующих версиях ReSharper IDE. Заполнившие анкету могут выиграть от 1 до 20 лицензий на ReSharper (плагин для VS .NET 2003).
  4. Вышла новая версия .netCHARTING 3.0 ASP.NET
    Просто новая версия хорошего компонента для отображения графиков и диаграмм на ваших веб-страничках.
  5. Вышел RichSuite
    Richer Components объявила о выходе RichSuite. RichSuite предлагает все свои компоненты в одном пакете - RichTextBox, RichDatePicker, RichSlider, и компонент, который скоро выйдет - RichHelpTip. Доступна бесплатная версия с ограничением времени использования.

{К содержанию}

Что должен знать программист ASP.NET о доменах приложения

Что должен знать программист ASP.NET о доменах приложения

ЯЗЫК:
Автор статьи: Scott Allen

ПЕРЕВОД: Чужа В.Ф. ака hDrummer


Тогда, когда мы запускаем программу Notepad в Windows, программа исполняется в контейнере, известном как «процесс». Мы можем запустить несколько экземпляров приложения Notepad, и каждый из них будет запущен в своём процессе. Используя приложение Диспетчер Задач, можно просмотреть все процессы, запущенные в нашей системе.

Процесс содержит исполняемый код и данные программы в памяти, полученной у операционной системы. В процессе будет существовать как минимум один поток, а в большинстве случаев их несколько. Если программа открывает какие-то файлы или ресурсы, то все они будут принадлежать этому процессу.
Процесс сам по себе замкнут. Т.е. ошибочный код внутри процесса не может повредить области с кодом и данными внутри других процессов. Между тем, если взаимодействие внутри процесса осуществить легко, то для взаимодействия между процессами необходимо задействовать специальную технику. Также каждый процесс исполняется в определённом контексте безопасности, который указывает, что можно делать этому процессу на машине или в сети, а чего нельзя.
Процесс – наименьшая единица изоляции в ОС Windows. Это представляет проблему для ISP (провайдер сервиса Интернет), которые хотят хостить сотни приложений ASP.NET на одном сервере. ISP возможно захочет изолировать каждое приложение ASP.NET для того, чтобы они не вмешивались в данные/код других приложений на этом же сервере, но цена запуска и исполнения каждого приложения в отдельном процессе может быть слишком высока для этого.

Познакомимся с доменом приложения

.NET представляет нам концепцию домена приложения или AppDomain. Также, как и процесс, AppDomain является одновременно контейнером и ограничителем. Библиотека времени выполнения .NET использует AppDomain как контейнер для кода и данных, также, как это делает операционная система (ОС) в случае с процессом. Также, как ОС поступает с процессом, изолируя его на случай выполнения ошибочного кода, так и .NET использует AppDomain для изолирования кода в безопасных границах.

AppDomain принадлежит только одному процессу, но этот один процесс может содержать несколько таких доменов. AppDomain относительно дёшев при создании (если сравнивать с процессом) и требует меньше ресурсов для поддержки, опять же если сравнивать с процессом. Поэтому AppDomain и является хорошим решением для ISP, хостящего сотни приложений. Каждое приложение может находиться в изолированном домене и десятки таких доменов могут существовать внутри одного процесса – тотальная экономия.

Домены приложения и Вы

Вы создали два приложения ASP.NET на одном и том же сервере и не делали никакой дополнительной конфигурации. Что произойдёт?

Единственный процесс ASP.NET будет хостить оба приложения ASP.NET. На Windows XP и Windows 2000 этот процесс зовётся aspnet_wp.exe, он выполняется в контексте безопасности локальной учётной записи ASPNET. В Windows 2003 этот процесс имеет имя w3wp.exe и по умолчанию работает под учётной записью NETWORK SERVICE.
Объект живёт в одном домене приложения (AppDomain). Каждое приложение ASP.NET будет иметь свой собственный набор глобальных переменных: Cache, Application и Session – т.е. они не являются общими. Но код обоих приложений содержится в одном процессе, изолированный по доменам приложения .NET AppDomain. Если в приложениях есть классы с открытыми или статическими членами и такие классы используются в обоих приложениях, то каждый AppDomain будет иметь свою собственную копию статических полей – данные не являются общими. Код и данные каждого приложения безопасно изолированы в границах, установленных доменом приложения.
Для того, чтобы взаимодействовать с объектами или передавать объект между AppDomains, необходимо рассмотреть подходы, используемые в .NET для коммуникации через границы доменов/процессов - .NET ремоутинг или веб-сервисы.
Единственная проблема с доменами приложения как «хранителями границ» - приложения ASP.NET по умолчанию запускаются в режиме полностью доверяемого кода. Полностью доверенный код может выполнять родной (native) код, а он имеет доступ ко всему, что есть в процессе. Необходимо запускать приложения как код, которому частично доверяют, тем самым ограничивая доступ к неуправляемому коду и проверять управляемый код для того, чтобы обезопасить домен приложения.

Теневые копии и рестарты

После того, как сборка загружена в AppDomain, уже нет способа удалить её оттуда. Однако, есть возможность удалить сам домен приложения из процесса.

Если же вы копируете новую библиотеку в подкаталог bin приложения, то библиотека времени выполнения ASP.NET понимает, что появилась новая версия и выполнять уже нужно именно её. Поскольку ASP.NET не может просто подменить библиотеку в существующем домене AppDomain, то создаётся новый домен. Старый домен останавливается таким образом, чтобы завершить выполнение текущих запросов, после чего домен выгружается из памяти. Новый домен стартует с новым кодом и начинает обрабатывать все запросы.
Обычно, после загрузки библиотеки в процесс, процесс блокирует библиотеку и вы не можете перезаписать файл на диске. Однако, домен приложения обладает возможностью создания «Теневой Копии», которая даёт возможность сборке оставаться на диске в разблокированном и заменяемом состоянии.
Библиотека времени выполнения инициализирует ASP.NET «теневой копией», доступной в каталоге bin приложения. AppDomain копирует любую библиотеку dll, необходимую для работы приложения, во временный каталог перед тем как заблокировать её и загрузить в память. «Теневая Копия» позволяет нам перезаписать любую dll в каталоге bin с целью обновления, без остановки самого приложения.

Хозяин вашего домена

Домены приложения заменяют процесс ОС в качестве единицы изоляции кода .NET. Понимание концепции доменов приложений даст вам ощущение понимания того, что происходит за кулисами во время работы приложения ASP.NET. Используя свойство CurrentDomain класса AppDomain, вы можете исследовать свойства домена, в котором исполняется ваш код, включая настройки «Теневой Копии», о которой мы говорили в этой статье.

{К содержанию}

Время кода

Раскладка клавиатуры и выбор языка
В этой статье рассказывается каким образом можно написать приложение WinForm, которое автоматически устанавливает язык ОС.

ЯЗЫК: C#
АВТОР: Yariv Amar,
Информация об авторе
ПЕРЕВОД: Чужа В.Ф ака hDrummer
Код к статье: TestLanguage.zip

Вступление

Я уверен, что большинство неангличан ОС Windows устанавливают как минимум с двумя языками. Руками сменить язык можно с использованием ALT+CTRL, но что делать, если вы хотели бы написать приложение WinForm, которое делало бы это автоматически? Читайте дальше.

Работаем с Windows API

Прочтите пожалуйста статью C# и API' №79.
В этой статье я покажу как использовать:

Идентификатор Язык
0x0000 Языконезависимый
0x0409 Английский (US)
0x040d Иврит

Пример кода

OK, теперь, обладая необходимой информацией, можно приступить к работе. В этом демонстрационном примере я покажу как создать библиотеку LanguageSelector. Создадим новый проект C# - библиотеку классов, назовём её LanguageSelector. Добавим:

using System.Runtime.InteropServices;

И ещё вот такие константы:

const uint KLF_ACTIVATE = 1; //активизируем раскладку
const int KL_NAMELENGTH = 9; // длина буфера клавиатуры
const string LANG_EN_US = "00000409";
const string LANG_HE_IL = "0000040d";

Теперь импортируем функцию LoadKeyboardLayout из “user32.dll”

[DllImport("user32.dll")] private static extern long LoadKeyboardLayout(
string pwszKLID, // передаём идентификатор местных специфик
uint Flags // и его настройки
);

Также импортируем функцию GetKeyboardLayoutName:

[DllImport("user32.dll")]
//[out] строка, получающая имя локального идентификатора
private static extern long GetKeyboardLayoutName(System.Text.StringBuilder pwszKLID);
Заметьте, что вместо StringBuilder можно было использовать свойство [MarshalAs…]. Для простоты демонстрационного кода, тут мы не будем использовать систему маршаллинга между управляемым/неуправляемым кодом.

Добавляем функциональность - Получаем имя текущей раскладки клавиатуры

Нижеследующий код является обёрткой для функции GetKeyboardLayoutName в более удобной форме, которую мы используем позже.

public static string getName() {

System.Text.StringBuilder name = new System.Text.StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
return name.ToString();
}
Подсказка: можно использовать вышеприведенную функцию для нахождения установленных языков на целевой машине.

Смена расладки клавиатуры

Следующие две функции принудительно сменяют раскладку клавиатуры. На моей машине установлены Еврейская и Английская раскладки, также можно добавить дополнительные языки – по желанию, используя соответствующий идентификатор языка.

public static void Hebrew()
{
//загружаем и активизируем раскладку для текущей нити
LoadKeyboardLayout(LANG_HE_IL, KLF_ACTIVATE);
}
public static void English()
{
//загружаем и активизируем раскладку для текущей нити
LoadKeyboardLayout(LANG_EN_US, KLF_ACTIVATE);
}

Строим приложение WinForm

Добавим новое приложение на C# и разместим на нём три кнопки с названиями English, Hebrew, Get language ID. Добавим ссылку на библиотеку LanguageSelector, а также добавим строчку using LanguageSelector; теперь щёлкнем на каждой кнопке и добавим следующий код:

private void buttonHE_Click(object sender, System.EventArgs e)
{
KeyboardLayout.Hebrew();
}
private void buttonEN_Click(object sender, System.EventArgs e)
{
KeyboardLayout.English();
}
private void buttonGetID_Click(object sender, System.EventArgs e){
string keyboardID;
keyboardID = KeyboardLayout.getName();

MessageBox.Show(this,"Current keyboard layout ID: " + keyboardID,
"Keyboard layout",MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

На этом всё.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

Как в DataSet добавить DataTable Компонентная модель Access INSERT INTO: как указать, что значение в VALUES это число со зн. после запятой?
.NET+Oracle
ShowInTaskBar и Window Handle
Как заюзать WSDL
autosize для формы


На этом двадцать восьмой выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное