OpenNETCF и Windows Embedded Standard O / S

Если у меня есть приложение, написанное на .net Compact Framework (и работающее в Windows CE) и теоретически совместимое с Windows Embedded Standard O / S, будет ли оно по-прежнему совместимым, если будет использовать функциональность OpenNETCF?

Например, запуск файлов .exe с помощью OpenNETCF. Я предполагаю, что OpenNETCF использует P / Invoke под капотом, что может сделать приложение несовместимым с другими ОС, кроме Windows CE.

Я не использую P / Invoke в своем коде, но я не могу точно сказать, использует OpenNETCF или нет.

.net compact framework 2.0 и встроенный стандарт Windows


person sarsnake    schedule 25.05.2011    source источник


Ответы (2)


OpenNETCF действительно широко использует P / Invoke.

По сути, это оболочка для некоторых основных функций ОС в Windows CE и ее производных, которые иначе не реализованы в Compact Framework. На практике это означает обширный P / вызов coredll.dll; базовый модуль ОС для Windows CE.

Windows Embedded Standard - это Windows XP. По этой причине я не ожидал, что вы сможете использовать OpenNETCF.

В зависимости от используемой версии вы можете получить код OpenNETCF здесь (или купите, конечно, самую последнюю) и посмотрите, что творится под капотом. Кроме того, вы можете обнаружить, что вызовы, которые вы делаете в OpenNETCF, фактически реализуются в любом случае при компиляции для Windows Embedded Standard.

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

Вы можете добавить символ условной компиляции либо в проект CE, либо в проект Windows Embedded, а затем исправить ошибки следующим образом (этот пример не для OpenNETCF, но вы поняли идею):

    public static string ExecutingAssembly
    {
        get
        {
#if WindowsCE
            return Assembly.GetExecutingAssembly().GetName().CodeBase;
#else
            return Assembly.GetExecutingAssembly().Location;
#endif
        }
    }

Очевидно, что затем вам нужно будет создать сборку для каждой платформы, поскольку полученные сборки теперь будут разными.

person Chris Wallis    schedule 25.05.2011
comment
хорошо знать. Знаете ли вы, какие пространства имен его используют, а какие нет? В настоящее время я использую OpenNETCF.IO; OpenNETCF.Windows.Forms; Пространства имен OpenNETCF.WindowsCE. Должен ли я предполагать, что все они используют P / Invoke? Спасибо - person sarsnake; 26.05.2011
comment
OpenNETCF обширен, и да, я предполагаю, что P / Invoke используется в большинстве, если не во всех его пространствах имен. Однако я уточнил выше возможный путь вперед. - person Chris Wallis; 26.05.2011

Как указывает Крис, SDF интенсивно использует coredll P / Invokes. Это не значит, что все работает, но это определенно минное поле. У меня есть проект CF и проект FFX, и в местах, где у меня есть совпадения, я использую псевдонимы, например:

#if WindowsCE
using Thread = OpenNETCF.Threading.Thread2;
#else
using Thread = System.Threading.Thread;
#endif

Затем в коде вы просто делаете свой обычный

var thread = new Thread(...);

И все получается.

Давным-давно мы начали интересный побочный проект по созданию «прокладки» coredll для рабочего стола. Это означает, что p / invoke для «coredll» на рабочем столе фактически вызовет эту DLL, которая, в свою очередь, будет перенаправлять вызовы на kernel32, user32 или что-то еще. Наше тестирование того, что мы реализовали (и там довольно много), показало, что это работает нормально, поэтому, если вы используете ограниченное подмножество API, простое удаление его на ПК может заставить сборку CF «просто работать».

person ctacke    schedule 26.05.2011
comment
Это интересный побочный проект. - person Chris Wallis; 26.05.2011