2017-01-04 6 views
0

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

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

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

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

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

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

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

+0

_Until recent_ - так что-то изменилось. В какой ОС вы работаете, какие изменения в приложении, можете ли вы сопоставить это с недавним обновлением? –

+0

@HenkHolterman Действительно, я начал использовать компонент WebBrowser. Мне кажется, как будто реализация WebBrowser на мобильном устройстве может работать нормально в MTA, в то время как компонент WebBrowser с полномасштабной оконной системой требует STA. На самом деле это причина этого вопроса (я хотел оставить это вне сферы охвата этого вопроса, потому что это только усложняет ситуацию) :) – bvdb

+2

Простые приложения для CF будут работать без изменений на рабочем столе, это хорошо известно. Но приложения, использующие только API-интерфейсы CF (т. Е. Связанные с aygshell), не будут работать. Опция компиляции STAThread может использоваться только во время компиляции (AFAIK). Если DLL была скомпилирована с этой опцией, я могу себе представить, что она не будет работать на рабочем столе.Для компонента веб-браузера вам не нужно загружать этот жесткий код, но изнутри кода, а затем загружать либо полный каркасный, либо один CF. CF-формы жестко привязаны к MTA. Если COM загружен, который требует STA, он выдаст исключение. – josef

ответ

0

Таким образом, код должен запускаться только в состоянии 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.

Смежные вопросы