STAThread требование для оконных форм
AFAIK, все приложения Windows Forms должны установить [STAThread]
директива над их Main()
метод.
Однако есть исключение. Мы пишем приложения для устройств Windows Mobile, используя Compact Framework. Компактная структура даже не поддерживает [STAThread]
директива, она имеет только [MTAThread]
, Тем не менее, я никогда не сталкивался с какими-либо проблемами там.
Теперь, чтобы сделать это еще одним шагом, вы также можете запускать приложения Compact Framework в полнофункциональной системе Windows. Я думаю, что в этом случае будет использоваться полноценный.NET Framework.
На этом этапе мы запускаем код с MTA
состояние квартиры, в которой используются оконные формы по полноценной оконной системе. Это подводит меня к вопросу, если компактное фреймворковое приложение работает в полнофункциональной операционной системе Windows, почему оно не жалуется на отсутствие [STAThread]
директива?
1 ответ
Согласно этому ответу, я бы сказал, что на самом деле Windows Forms работают не на обычной машине, а на подмножестве. Конечно, может также случиться, что происходит какое-то проксирование, и фреймворк позаботится о начальной загрузке потока STA и распределении для вас туда-сюда.
Комментарий к этому вопросу конкретно:
Простые CF-приложения будут работать без изменений на рабочем столе, это хорошо известно. Но приложения, использующие только API CF (т.е. связанные с aygshell), не будут работать. Опция компиляции STAThread может использоваться только во время компиляции (AFAIK). Если DLL была скомпилирована с этой опцией, я могу представить, что она не будет работать на рабочем столе. Для компонента веб-браузера вам нужно не загружать этот жесткий код, а изнутри кода, а затем загружать либо полный каркас, либо CF. Формы CF жестко закодированы в MTA. Если загружен COM, который требует STA, он выдаст исключение.
Джозеф, похоже, указывает, что компактные каркасные формы будут успешно распространяться под MTA, но начинают волноваться, как только вы используете компонент на основе COM из winforms, который действительно требует STA.