Запуск компактного фреймворк-кода на настольном компьютере
Я сделал приложение для 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.