如何在.NET Core库中使用Windows Runtime类?

11
我将为您翻译以下内容,涉及到IT技术方面的问题:

我正在为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....
    }
}

虽然这段代码可以在传统的.NET Framework中编译成功,但我在尝试将其应用于Windows 10应用程序所使用的netcore50时遇到了问题。出现的原因似乎是像DependencyProperty或DependencyObject这样的类型没有包含在该配置中。
是否有适用于netcore50的NuGet包可供安装,其中包含这些类型,以便我可以从我的库中使用它们?
谢谢您的帮助。
编辑:我刚刚在VS中输入了DependencyProperty并按下F12。它似乎是存在于Windows.Foundation.UniversalApiContract程序集中,但在NuGet上没有这样的包。

我相信这是不可能的——像 WPF 这样的东西并不打算跨平台,尽管如果你感兴趣,可以研究一下 Perspex 这样的项目。 - Warty
2
@Warty 我认为你可以这样做。.NET Core并不意味着你只能创建跨平台的库,它意味着可以创建它们。例如,您仍然可以使用像Microsoft.Win32.Registry这样的包。 - James Ko
3个回答

6

我终于自己解决了这个问题!(如果你正在寻找快速答案,可以向下滚动。)

我偶然记起.NET Core GitHub仓库有一堆WinRT特定的库,例如System.Runtime.WindowsRuntime。所以,我去那里看看他们是如何做到的。

看起来他们使用某种内部托管的“目标包”,其中包含一个单独的Windows.winmd文件(其中包含Windows Runtime中的所有类型),以实现此效果。不幸的是,该程序包托管在专为.NET Core团队而设的私有NuGet源上,因此我无法使用它。

我在CoreFX仓库这里提出了这个问题,所以我可以请求微软为此问题提供官方解决方案。同时,我已经采取了行动。我在我的笔记本电脑上找到了所有不同版本的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!";
    }
}

并且它将会正常工作。


6

-1

据我所知,WPF不兼容.net Core,Windows 10通用应用程序也不兼容。目前只有控制台应用程序和Web应用程序与.net Core兼容。您仍然可以使用新的代码库和新的项目系统,但需要从配置中删除.net Core才能编译。 如果您想在Linux上使用桌面应用程序并使用.net Core,则只需等待,或使用兼容的窗口应用程序框架(如果有可用的话)。您可以使用基于html/js的跨平台框架,例如Electron或Cordova(不确定是否有基于Cordova的桌面应用程序框架)。


据我所知,Perspex是目前唯一的.NET Core UI库。 - Paul Knopf
3
很遗憾,我不认为这是正确的。 .NET Core 不是为了编写可以在每个平台上运行的东西,那是 PCL 的作用。相反,它会根据在 project.json 中指定的每个配置编译一次。这使您可以在代码中使用 #if NET46 并为每个平台专门设计代码。 - James Ko
1
WPF 在 .NET Core 3 中得到支持。 - Mendy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接