Showing posts with label WinForms. Show all posts
Showing posts with label WinForms. Show all posts

Tuesday, August 9, 2011

AssemblyResolve и локализация

В .NET 4.0 имеется небольшая, но не приятная проблема - обработчик загрузки модулей AsseblyResolve теперь вызывается, если не найден файл с ресурсами локализации xxx.resources.dll.

Проблема возникает при переходе с 2.0 на 4.0 для тех, кто генерил исключения в AssemblyResolve, если файл не найден. Правильнее возвращать null - тогда падать не будет. Иначе ждет сюрприз...

Wednesday, July 27, 2011

Как правильно подключить обработчик AssemblyResolve в WinForms

Возник интересный вопрос – в какой момент правильнее подключить AssemblyResolve, который, как известно, позволяет подложить нужные dll, если система сама их не нашла.
Вариант 1 – делаем в конструкторе основной формы
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            AppDomain.CurrentDomain.AssemblyResolve +=
                        new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Этот вариант будет работать только в том случае, если форма не использует искомые dll для UI, т.е. конструктор успеет вызваться. Для подключения таким образом UI-компонентов этот вариант не работает.
Вариант 2 – в методе Main
Этот вариант работает, если нужные dll не должны сразу загрузиться в домент. Даже если главная форма использует dll для построения UI, то это будет работать. Если же dll нужны для создания Application, то и этот вариант не сработает.
Вариант 3 – самый надежный, статический конструктор Program
Создаем статический конструктор для основного класса.
    static class Program
    {
        static Program()
        {
            AppDomain.CurrentDomain.AssemblyResolve +=
                 new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            Application.SetUnhandledExceptionMode(
                 UnhandledExceptionMode.CatchException);
        }
Теперь обработчик будет гарантированно создан.

Friday, December 24, 2010

Обработка необработанных исключений в WinForms

Обработчик добавляется следующим образом:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

Но этого мало. Нужно еще "включить" работу этого обработчика:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Причем, создать обработчик можно в любом месте кода, например, в главной форме. А вот включить его можно только до добавления главной формы, т.е. в методе
Main.

Tuesday, November 23, 2010

Подключение Dictionary к ComboBox

Простой способ подключить словарь к выпадающему списку без циклов и т.д. Все просто:

cbCommand.DataSource = new BindingSource(myDictionary);"Value";"Key";
cbCommand.DisplayMember =
cbCommand.ValueMember =

Замечу, что подключить его напрямую нельзя, т.к. Dictionary не реализует IList.