【问题标题】:STAThread requirement for windows formswindows窗体的STAThread要求
【发布时间】:2017-01-05 14:20:39
【问题描述】:

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

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

现在,更进一步,您还可以在成熟的 Windows 系统上运行 Compact Framework 应用程序。我认为在这种情况下将使用成熟的 .NET 框架。

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

【问题讨论】:

    标签: c# compact-framework apartment-state


    【解决方案1】:

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

    This Question的评论:

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

    Josef 表示,紧凑的框架表单似乎可以在 MTA 下顺利运行,但一旦您使用 确实需要 STA 的 winforms 中的基于 COM 的组件,就会吓坏了。 p>

    【讨论】:

    • social.msdn.microsoft.com/Forums/en-US/…“不,你没有遗漏任何东西 - NETCF 上没有这样的属性,也没有办法强制 STA 行为。MTA 是唯一受支持的模式,通常你不需要NETCF 上的 STA。"
    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2013-02-06
    • 2010-10-18
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多