Персональный сайт Александра Тауениса » ElementHost & System.InvalidOperationException

ElementHost & System.InvalidOperationException

Вообще, совмещение WPF и Windows Форм (как и любых двух фреймворков интерфейса) является полнейшим костылём. Но бывают случаи, когда приходится их совмещать. Для этого в WinForms 3.5+ имеется элемент управления ElementHost. Но вот ведь незадача, в одних проектах он работает замечательно, в других сразу после добавления в форму программа перестаёт работать с ошибкой в автоматически созданном VS файле xxx.Designer.cs.

При выполнении программы на строке инициализации экземпляра контрола ElementHost внутри зоны генерированного студией кода выскакивает исключение

System.InvalidOperationException was unhandled
  Message=The calling thread must be STA, because many UI components require this.
  Source=PresentationCore
  StackTrace:
       at System.Windows.Input.InputManager..ctor()
       at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
       at System.Windows.Input.KeyboardNavigation..ctor()
       at System.Windows.FrameworkElement.FrameworkServices..ctor()
       at System.Windows.FrameworkElement.EnsureFrameworkServices()
       at System.Windows.FrameworkElement..ctor()
       at System.Windows.Controls.Panel..ctor()
       at System.Windows.Forms.Integration.AvalonAdapter..ctor(ElementHost hostControl)
       at System.Windows.Forms.Integration.ElementHost..ctor()
       at WindowsFormsApplication1.Form1.InitializeComponent() in ***Form1.Designer.cs:line **

В общем, простейший да к тому-же и эталонный код создания объекта отказывается работать под совершенно неадкеватным предлогом. <starik mode>Вообще, .NET это ещё тот чёрный ящик, без пол-литры не поймешь, как оно работает или почему не работает (и даже с пол-литрой).</starik mode> О, сколько мата было выговорено, пока я ломал голову над этим, даже не сосчитать. Решение было интересным (не помню, как до него я дошёл, но в чистом виде оно не гуглилось) — добавить [STAThread] перед основной функцией, в большинстве случаев это static void Main() в файле Program.cs.

Читатель! Вообще, когда пользуешься фреймворками, знай, как они работают на уровне…желательно даже на уровне ассемблерного кода! То, что внешне C#.Net кажется аналогичным C++, VisualBasic 6, очень обманчиво. Тут всё вообще по другому работает.



Один комментарий к “ElementHost & System.InvalidOperationException”

  1. Спасибо. Это помогло 🙂

Оставить комментарий

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.