Windows窗体的STAThread要求

时间:2017-01-05 14:20:40

标签: c# compact-framework apartment-state

AFAIK,所有Windows窗体应用程序都应将[STAThread]指令设置为Main()方法之上。

然而,有一个例外。我们正在使用Compact Framework编写Windows Mobile设备的应用程序。 Compact框架甚至不支持[STAThread]指令,它只有[MTAThread]。不过,我从来没有遇到任何问题。

现在,为了使它更快,您还可以在完整的Windows系统上运行Compact Framework应用程序。我认为在这种情况下,将使用完整的.NET框架。

此时,我们正在运行具有MTA公寓状态的代码,该状态在完整的Windows系统上使用Windows窗体。这让我想到了一个问题,如果一个紧凑的框架应用程序在一个完整的Windows操作系统上运行,为什么它不抱怨缺少[STAThread]指令?

1 个答案:

答案 0 :(得分:1)

根据This Answer,我说它不是实际上在正常计算机上运行的Windows窗体,而是一个子集。它当然也可以是某种代理正在进行,框架正在处理引导STA线程并为您来回编组。

This Question的评论具体:

  

简单的CF应用程序无需在桌面上进行修改即可运行,这是众所周知的。但是,使用仅使用CF的API(即与aygshell相关)的应用程序将无法运行。 STAThread编译选项只能在编译期间使用(AFAIK)。如果使用该选项编译DLL,我可以想象它不会在桌面上运行。对于Web浏览器组件,您不需要加载此硬编码,而是从代码中加载,然后加载完整框架1或CF加载。 CF表格硬编码为MTA。如果加载了需要STA的COM,则会产生异常。

通过约瑟夫,似乎表明紧凑的框架形式将很乐意在MTA下滚动,但是一旦你使用基于COM的组件,其中确实需要STA,就会惊慌失措。