Запуск компактного фреймворк-кода на настольном компьютере

Я сделал приложение для Windows Compact Framework 3.5, которое работает нормально.

После компиляции .exe файл создан на моем компьютере. До недавнего времени я мог также запустить этот исполняемый файл на моем компьютере. (без использования симулятора)

Но недавно я заметил, что мое приложение работает только на мобильных устройствах. Когда я пытаюсь запустить его на своем настольном компьютере, я получаю странное сообщение об ошибке, которое указывает, что я должен запустить свое приложение с [STAThread] директива для Main() метод.

Однако для моих мобильных устройств это не обязательно, все работает как есть. На самом деле, я даже не могу добавить [STAThread] к исходному коду, потому что компактная структура не поддерживает его. Добавление этого вызывает ошибки компиляции.

К сожалению, это тоже проблема сейчас. Я хотел бы добавить условный код, который оценивает, работает ли он на Windows CE или Windows Desktop. Когда он запускается на рабочем столе, он должен запустить код в STAThread Режим. Однако я не могу найти способ добавить этот вид кода, потому что он не компилируется. Это всегда сводится к тому, что компилятор не знает, что такое STAThread.

Есть ли способ или хитрость, чтобы справиться с этим?

Хороший обходной путь для меня - это скомпилировать его другим способом, возможно, выбрав другую целевую платформу, когда я скомпилирую ее для настольных компьютеров. Однако я не могу сделать это в настоящее время. Есть идеи?

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.

Другие вопросы по тегам