【问题标题】:running compact framework code on desktop computer在台式计算机上运行紧凑的框架代码
【发布时间】:2017-01-04 17:54:18
【问题描述】:

我为 Windows Compact Framework 3.5 做了一个应用程序,它似乎工作正常。

编译后,我的电脑上会创建一个.exe 文件。 直到最近,我实际上还可以在我的计算机上运行这个 exe 文件。 (不使用模拟器)

但最近我注意到我的应用程序只能在移动设备上运行。当我尝试在我的台式计算机上运行它时,我收到一条奇怪的错误消息,表明我应该使用 [STAThread] 指令为 Main() 方法运行我的应用程序。

但是,对于我的移动设备,这不是必需的,一切正常。事实上,我什至无法将[STAThread] 添加到源代码中,因为紧凑的框架不支持它。 添加它会导致编译错误。

不幸的是,这也是现在的问题。 我很想添加一些条件代码来评估它是在 Windows CE 还是 Windows 桌面上运行。 当它在桌面上运行时,它应该以STAThread 模式启动代码。但是,我找不到添加此类代码的方法,因为它无法编译。它总是归结为编译器不知道 STAThread 是什么。

有没有办法或技巧来处理这个问题?

对我来说一个好的解决方法是用不同的方式编译它,也许是在我为台式计算机编译它时选择不同的目标平台。但是,我目前无法这样做。有什么想法吗?

【问题讨论】:

  • 直到最近 - 所以发生了一些变化。您正在运行什么操作系统,对应用程序进行了哪些更改,您能否将其与最近的更新相匹配?
  • @HenkHolterman 实际上,我开始使用 WebBrowser 组件。在我看来,好像移动设备上的 WebBrowser 实现可以在 MTA 中正常运行,而完整的 Windows 系统的 WebBrowser 组件需要 STA。这确实是这个问题的原因(我想把这个排除在这个问题的范围之外,因为它只会让事情变得更复杂):)
  • 简单的 CF 应用程序无需修改即可在桌面上运行,这是众所周知的。但是使用仅限 CF 的 API(即 aygshell 相关)的应用程序将无法运行。 STAThread 编译选项只能在编译期间使用(AFAIK)。如果使用该选项编译 DLL,我可以想象它不会在桌面上运行。对于 Web 浏览器组件,您无需加载此硬编码,而是从代码中加载,然后加载完整的框架或 CF 框架。 CF 表格被硬编码为 MTA。如果加载了需要 STA 的 COM,则会出现异常。

标签: c# compact-framework


【解决方案1】:

总而言之,代码只需要在桌面计算机上运行时以 STA 状态运行。此外,STA 状态甚至在移动设备上都不可用。

这是我想出的:

    static void Main() 
    {
        Type type = typeof(Thread);
        MethodInfo methodInfo = type.GetMethod("SetApartmentState");

        if (methodInfo != null)
        {
            // full .net framework
            // --> requires STA apartmentstate

            Thread thread = new Thread(() => Run());
            methodInfo.Invoke(thread, new object[] { ApartmentState.STA });
            thread.Start();
            thread.Join();
        }
        else
        {
            // .net compact framework
            // --> needs no special attention (can run in MTA)
            Run();
        }
    }

注意:上面的Run() 方法是启动应用程序的方法。

由于代码是用Compact Framework编写的,所以无法直接设置公寓状态,只是因为没有setApartmentState方法。但幸运的是,它可以使用反射来完成,因为当(且仅当)代码在完整的 .net 框架上运行时,该方法实际上在运行时可用。

【讨论】:

  • 你先生,拯救了我的一天。我在移动和桌面上运行的 .NET CF 3.5 程序上使用 OpenFileDialog。在桌面版本上,它会抛出 Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process. 您的解决方案使我不必创建自己的 OpenFileDialog。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多