Несмотря на то, что официально в WP7 можно писать программы используя только управляемый код и доступа к API самой системы вроде как нет, способ это обойти все же есть. Причем оставила его сама Microsoft - это InteropServices дотнета.
WP7 построена на базе ядра Windows CE6, поэтому на ней возможно запускать абсолютно любые CE6 программы (теоретически). Проблема в том, что Microsoft это искусственно ограничили, запретив неуправляемому коду запускаться на исполнение. К счастью - есть замечательный механизм interop, позволяющий использовать COM компоненты в управляемом (.net) приложении. Это и есть путь к запуску native кода. Почему то никакой обобщенной информации на эту тему до сих пор нет - только крупицы тут и там...
Понятное дело - это не разрешено мелкомягкими и программы такого рода никогда не пройдут проверки и следовательно никогда не попадут в Marketplace. Но кого это волнует :)
Что требуется:
Windows Mobile 6 SDK (хитрые мелкомягкие удалили его со своего сайта - нужно искать в интернетах)
Visual Studio 2008 (для native библиотек)
Visual Studio 2010 (для WP7 кода)
Две отдельных ОС - т.к. две студии на одной винде не живут (я пользуюсь виртуалкой для 2008й студии и WM6 сдк)
Native код. В 2008й студии создаем новый SmartDevice проект (я использую темплейт ATL SmartDevice Project - нам ведь нужен COM) для WM6 SDK.
Это будет наша COM библиотека - в ней нужно объявить и реализовать COM класс, самый обычный, public методы которого будут выполнять действия недоступные для управляемого кода WP7 (например сокеты). Следует учесть, что даже неуправляемый код все равно выполняется в .net окружении, следовательно на него действуют все ограничения - например запрет доступа к файловой системе. Вот для примера простейший COM класс (я его сгенерил с помощью визарда):
class ATL_NO_VTABLE CWP7NativeClass :
public CComObjectRootEx
public CComCoClass
public IDispatchImpl
{
public:
CWP7NativeClass()
{
}
#ifndef _CE_DCOM
DECLARE_REGISTRY_RESOURCEID(IDR_WP7NATIVECLASS)
#endif
BEGIN_COM_MAP(CWP7NativeClass)
COM_INTERFACE_ENTRY(IUnknown)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(Foo)(int a, int b, int* pResult);
};
Ну и реализация нашего супер метода:
STDMETHODIMP CWP7NativeClass::Foo(int a, int b, int* pResult)
{
*pResult = a + b;
return S_OK;
}
Компилируем, получаем dll, подкладываем ее в xap нашего WP7 приложения.
Использование native COM библиотеки.
Создаем в 2010й студии проект для WP7. Самой сборки InteropServices в WP7 SDK нет, но в самой системе (на телефоне) она есть и ничто не мешает нам ее подгрузить. Далее - объявляем интерфейс и класс для работы с нашим COM классом:
[ComImport, Guid(" XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX "), ClassInterface(ClassInterfaceType.None)]
public class CSomeClass
{
}
Далее - интерфейс, он должен в точности повторять интерфейс нативного COM класса (функции, параметры)
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(" XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ")]
internal interface ISomeInterface
{
void Foo(uint a, uint b, out uint oi);
}
Assembly a = Assembly.Load("Microsoft.Phone.InteropServices, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e");
Type comBridgeType = a.GetType("Microsoft.Phone.InteropServices.ComBridge");
MethodInfo dynMethod = comBridgeType.GetMethod("RegisterComDll", BindingFlags.Public | BindingFlags.Static);
dynMethod.Invoke(null, new object[] { "some_library.dll", new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX") }); //GUID должен совпадать с таковым у выше объявленного интерфейса
Все - мы зарегистрировали нашу COM библиотеку в системе.
Дальше - стучимся к нашему COM классу, и вызываем один из его методов:
ISomeInterface pInterface= (ISomeInterface)new CSomeClass();
int result = 0;
pInterface.Foo(10, 10, out result) ;
Собственно все. Упуская "сложности" с созданием своей нативной библиотеки (почему-то C++ сейчас не все любят), само по себе ее использование в WP7 достаточно тривиально.
Доступа к файловой системе так все равно не получить (будет вылетать исключение) - т.к. все это хозяйство все равно контролируется исполняемой средой.
1 комментарий:
Восхитительно
Отправить комментарий