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

我为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框架上运行时(并且只有当代码运行时),该方法实际上才会在运行时可用。

链接地址: http://www.djcxy.com/p/82683.html

上一篇: running compact framework code on desktop computer

下一篇: Using async/await with a forEach loop