Как использовать классы Windows Runtime в библиотеках .NET Core?

Я разрабатываю библиотеку для использования с WPF и Windows 10. У меня возникают проблемы с ее компиляцией на последнем. Вот некоторые из кода:

project.json

{
    "frameworks": {
        "net46": {
            "frameworkAssemblies": {
                "WindowsBase": "4.0.0.0"
            }
        },
        "netcore50": {
            "dependencies": {
                "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0"
            }
        }
    }
}

Dependency.cs

using System;
using System.Collections.Generic;
#if NET46
using System.Windows; // .NET Framework 4.6
#elif NETCORE50
using Windows.UI.Xaml; // Windows 10 apps
#endif

public static class Dependency
{
    public static DependencyProperty Register<T, TOwner>(string name, PropertyChangedCallback<T, TOwner> callback)
        where TOwner : DependencyObject
    {
        // Code here....
    }
}

Хотя этот компилятор отлично подходит для net46 (который является традиционной платформой .NET Framework), мне трудно заставить его работать для netcore50 (который может использоваться приложениями Windows 10). По некоторым причинам, похоже, что такие типы, как DependencyProperty или DependencyObject, не включены в эту конфигурацию.

Есть ли netcore50 -компонентный пакет NuGet, который я могу установить, который содержит эти типы, поэтому я могу использовать их из своей библиотеки?

Спасибо за помощь.


EDIT: Я просто набрал DependencyProperty в VS и нажму F12. Похоже, что этот тип живет в сборке Windows.Foundation.UniversalApiContract, но на NuGet такого пакета нет.

Ответ 1

Наконец решила проблему самостоятельно! (Если вы ищете быстрый ответ, вы можете прокрутить вниз.)

Я случайно вспомнил, что .NET Core GitHub repo имел кучу специфичных для WinRT библиотек, таких как System.Runtime.WindowsRuntime. Итак, я направился туда, чтобы посмотреть, как они это сделали.

Похоже, что они используют какой-то встроенный таргетинг-пакет, который содержит один файл Windows.winmd (который содержит все типы в Windows Runtime), чтобы добиться этого эффекта. К сожалению, пакет размещен на приватном канале NuGet, предназначенном только для команды .NET Core, поэтому я не могу его использовать.

Я открыл проблему об этом в репозитории CoreFX здесь, поэтому я могу ходатайствовать перед Microsoft о официальном решении этой проблемы. Тем временем я взял дело в свои руки. Я нашел все различные версии Windows.winmd на своем ноутбуке и загрузил их как пакеты NuGet. Вот они:

Вы можете использовать их следующим образом:

"frameworks": {
    ".NETPortable,Version=v4.5,Profile=Profile32": {
        "dependencies": {
            "Target.WindowsRuntime": "8.1.2"
        }
    }
}

После этого вы сможете написать что-то вроде этого:

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

public class MyApp : Application
{
    public MyApp()
    {
        var button = new Button();
        button.Content = "Hello, world!";
    }
}

и он будет работать.

Ответ 2

WPF Не совместим с .net Core и не имеет универсальных приложений W10. Насколько мне известно, консольные приложения и веб-приложения в настоящее время совместимы с ядром .net, вы должны иметь возможность использовать новую базу кода с новым проектной системы, но вам нужно будет удалить ядро ​​.net из вашей конфигурации, чтобы скомпилировать если вы хотите использовать ядро ​​.net с linux с настольным приложением, вам просто придется подождать или использовать совместимую оконную инфраструктуру приложения (если таковые имеются), вы должны иметь возможность использовать базовую платформу кросс-платформы вокруг html/js, таких как Electron или Cordova (не уверен в этом, есть ли рамки для настольных приложений с Cordova)

Ответ 3

В .NET Core 3 и более поздних версиях (теперь в предварительном просмотре) есть пакет, который вы можете установить и который включает большинство классов WinRT Microsoft.Windows.SDK.Contracts