运行 桌面计算机上的紧凑框架代码

running compact framework code on desktop computer

我申请了 Windows Compact Framework 3.5,看起来工作正常。

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

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

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

不幸的是,这也是现在的问题。 我想添加一些条件代码来评估它是否在 Windows CE 或 Windows 桌面上 运行ning。 当它 运行在桌面上,它应该以 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 框架上的代码 运行 时。