Ссылки на библиотеки WinRT/UWP в настольном приложении .NET с сохранением поддержки Windows 7

Я пытаюсь ссылаться на классы «Windows.Networking.Connectivity» в своем настольном приложении. Меня в основном интересует обработка измеряемых соединений в моем приложении.

В основном то, что я пытаюсь сделать, просто:

var connectionCost = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();
            if (connectionCost.NetworkCostType == NetworkCostType.Unknown
                    || connectionCost.NetworkCostType == NetworkCostType.Unrestricted)
            {
                //Connection cost is unknown/unrestricted
            }
            else
            {
                //Metered Network
            }

Единственный известный мне метод, который позволяет настольному приложению ссылаться на сборки UWP, — это ручное редактирование файла проекта и добавление следующей строки в файл csproj:

<TargetPlatformVersion>8.0</TargetPlatformVersion>

Применение кода и «взлом» работает нормально, но проблема в том, что это не позволит моему приложению работать в Windows 7, которую мне нужно поддерживать.

Мне было интересно, есть ли способ ссылаться на сборки UWP в настольном приложении без отказа от поддержки Windows 7.

И поскольку пока я хочу только проверить, измеряется ли соединение, я открыт для предложений о том, как получить эту информацию без ссылки на сборки Windows.


person Zaid Amir    schedule 30.08.2017    source источник


Ответы (1)


Я нашел способ использовать отражение и вызывать методы UWP без указания целевой платформы. Для моего случая это то, что я сделал:

var networkInfoType = Type.GetType("Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType=WindowsRuntime");
            var profileType = Type.GetType("Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType=WindowsRuntime");
            var profileObj = networkInfoType.GetTypeInfo().GetDeclaredMethod("GetInternetConnectionProfile").Invoke(null, null);
            dynamic profDyn = profileObj;
            var costObj = profDyn.GetConnectionCost();
            dynamic dynCost = costObj;

            var costType = (NetworkCostType)dynCost.NetworkCostType;
            if (costType == NetworkCostType.Unknown
                    || costType == NetworkCostType.Unrestricted)
            {
                //Connection cost is unknown/unrestricted
            }
            else
            {
                //Metered Network
            }
person Zaid Amir    schedule 30.08.2017