在台式机上运行紧凑的框架代码
我为Windows Compact Framework 3.5创建了一个应用程序,该应用程序看起来工作正常。
  编译后,我的电脑上创建了一个.exe文件。  直到最近,我实际上也可以在我的电脑上运行这个exe文件 。  (不使用模拟器) 
  但最近我注意到我的应用程序只能在移动设备上运行。  当我尝试在桌面计算机上运行它时,收到一条奇怪的错误消息, 指示我应该使用Main()方法的[STAThread]指令运行我的应用程序。 
  但是,对于我的移动设备,这不是必需的,一切正常。  事实上,我甚至无法将[STAThread]添加到源代码中,因为紧凑框架不支持它。  添加它会导致编译错误。 
  不幸的是,这也是现在的问题。  我很想添加一些条件代码来评估它是否在Windows CE或Windows桌面上运行。  当它在桌面上运行时,它应该以STAThread模式启动代码。  但是, 我找不到添加这种代码的方法 ,因为它不能编译。  它总是归结为编译器不知道STAThread是什么。 
有没有办法或技巧来处理这个问题?
对我来说一个很好的解决方法是以不同的方式编译它,也许在我为桌面计算机编译时选择不同的目标平台。 但是,我目前无法这样做。 有任何想法吗 ?
总之,代码只需要在台式计算机上运行时在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框架上运行时(并且只有当代码运行时),该方法实际上才会在运行时可用。 
