В .NET 4.0 имеется небольшая, но не приятная проблема - обработчик загрузки модулей AsseblyResolve теперь вызывается, если не найден файл с ресурсами локализации xxx.resources.dll.
Проблема возникает при переходе с 2.0 на 4.0 для тех, кто генерил исключения в AssemblyResolve, если файл не найден. Правильнее возвращать null - тогда падать не будет. Иначе ждет сюрприз...
Showing posts with label WinForms. Show all posts
Showing posts with label WinForms. Show all posts
Tuesday, August 9, 2011
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.
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.
cbCommand.DataSource = new BindingSource(myDictionary);"Value";"Key";
cbCommand.DisplayMember =
cbCommand.ValueMember =
Замечу, что подключить его напрямую нельзя, т.к. Dictionary не реализует IList.
Subscribe to:
Posts (Atom)