在台式计算机上运行紧凑的框架代码

时间:2017-01-04 17:54:19

标签: c# compact-framework

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

编译后,在我的计算机上创建了.exe文件。 直到最近,我还可以在我的计算机上运行此exe文件。 (不使用模拟器)

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

总之,代码只需要在台式计算机上运行时才能在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框架上运行时(并且仅当代码运行)时,该方法实际上将在运行时可用。