Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 22.05.2015, 16:50   #1
 Пехотинец
Аватар для zZkamedosZz
 
zZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе цену
Регистрация: 17.01.2014
Сообщений: 67
Популярность: 4064
Сказал(а) спасибо: 145
Поблагодарили 138 раз(а) в 101 сообщениях
Отправить сообщение для zZkamedosZz с помощью Skype™
 
По умолчанию Обеспечение обратной совместимости .NET-приложений при использовании WinRT

Создание Windows Runtime (WinRT) в качестве API, с одной стороны, можно только приветствовать, так как предыдущий — WinAPI — особой простотой и человеколюбием не отличался. С другой стороны, в полный рост при этом всплывает проблема обратной совместимости. Что делать, если нужно заиспользовать какую-то приятную мелочь, появившуюся в Win8, но при этом не терять совместимости с Win7, все еще бодро шагающей в строю?

Официальный MSDN к этому относится весьма однозначно: если нужен WinRT, то забываем про версии Windows, старше восьмерки; если нужно поддерживать всякое старье, то собираем приложение отдельно без упоминания об WinRT. Такие вот простые и незатейливые парни работают в Microsoft. Тем не менее, решение проблемы, причем достаточно простое, удалось отыскать.

Суть в том, что мы можем всю нужную для счастья имплементацию, требующую WinRT, отнести в отдельную сборку, и в случае необходимости пытаться подгрузить ее динамически: удается — замечательно, ну а не получается — смиряемся и подсовываем заглушку с тем же интерфейсом.

Допустим, у нас возникло желание, пользуясь WinRT, читать значения датчика освещенности ноутбука/планшета. За это отвечает класс LightSensor из пространства имен Windows.Devices.Sensors. В таком случае диаграмму классов можно представить следующим образом:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Interfaces — самый обыкновенный Class Library, содержащий интерфейс IWinRTAccessor, возвращающий своим единственным методом GetLightValue ровно то, что нам нужно, а именно уровень освещенности в случае наличия сенсора и null в случае его отсутствия. Там же объявлена заглушка FakeWinRTAccessor, реализующая этот интерфейс, всегда возвращающая null. Кроме того здесь же расположен класс WinRTAccessorFactory, чей фабричный метод инстанцирует нужную реализацию IWinRTAccessor. Самая примитивная реализация этого фабричного метода выглядит так:
Код:
public static IWinRTAccessor GetAccessor()
        {
            if (_winRtAccessor == null)
            {
                try
                {
                    String path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), WinRTAccessorAssemblyName);
                    Assembly assembly = Assembly.LoadFile(path);
                    Type type = assembly.GetTypes().First(t => t.GetInterface(typeof (IWinRTAccessor).Name) != null);
                    _winRtAccessor = (IWinRTAccessor) Activator.CreateInstance(type);
                }
                catch
                {
                    _winRtAccessor = new FakeWinRTAccessor();
                }
            }
            return _winRtAccessor;
        }
WinRTLib — не менее обыкновенный Class Library (на имя которого и указывает константа WinRTAccessorAssemblyName), в котором сосредоточена логика работы с WinRT, однако для его поддержки нужно пойти на небольшую хитрость: прописать в файле проекта (.csproj) следующий Property Group:

<PropertyGroup>
<targetplatformversion>8.0</targetplatformversion>
</PropertyGroup>

И уже только после этого добавлять Windows Core References. Нас в данном случае интересует Windows.Devices:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сам метод, извлекающий показания датчика освещенности, спасибо новому API, весьма прост:
Код:
public Single? GetLightValue()
        {
            LightSensor light = LightSensor.GetDefault();

            if (light != null)
                return light.GetCurrentReading().IlluminanceInLux;
           
            return null;
        }
В принципе, этого бы и хватило, если не отложенная компиляция: в более ранних версиях Windows эта сборка имеет все шансы корректно загрузиться и инстанцировать экземпляр RealWinRTAccessor, а упасть уже на вызове его метода при обращении к WinRT. Чтобы этого не произошло, дернем WinRT прямо в конструкторе:
Код:
 public RealWinRTAccessor()
        {
            LightSensor.GetDefault();
        }
теперь, когда нужно получить показание датчика освещенности, можно дергать:
Код:
WinRTAccessorFactory.GetAccessor().GetLightValue()
Этот код отработает как при наличии WinRT, так и для более ранних версий Windows — в этом случае результатом вызова GetLightValue будет null.

Из преимуществ данного подхода: достижение поставленной цели и относительная простота.
Из недостатков: необходимость наличия прав на загрузку сборок через Assembly.LoadFile, ручная проверка (ее здесь нет, но должна быть) оригинальности подгружаемой сборки, ручное управление сборкой и местоположением WinRTLib, т.к. она не является Reference кого бы то ни было.
________________
Не можешь жить, займись чем-нибудь другим.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Баг] Баг на получение доступа к любому аккаунту в приложении Аквантика - 3Д Аквариум!!! Флюр Баги игр ВКонтакте 2 29.07.2014 00:18
[Программа] Многопоточная установка приложений на мультиаккаунты + получение id:auth the-boxi Баги игр ВКонтакте 3 22.12.2013 23:21
Необррабатываемое исключение в приложении... crazy_fantom Общение и обсуждение, архив Point Blank 3 10.12.2012 16:59
[Статья] Решение проблемы совместимости Counter-Strike и mail.ru агента E[X]treme Статьи и описания по Counter-Strike 0 05.09.2012 22:05

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 11:25.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net