C# 如何在.NET核心库中使用Windows运行时类?

C# 如何在.NET核心库中使用Windows运行时类?,c#,asp.net,.net,windows-runtime,asp.net-core,C#,Asp.net,.net,Windows Runtime,Asp.net Core,我正在开发一个用于WPF和Windows10的库。我在用后者编译时遇到了一些问题。下面是一些代码: project.json { "frameworks": { "net46": { "frameworkAssemblies": { "WindowsBase": "4.0.0.0" } }, "netcore50": { "depende

我正在开发一个用于WPF和Windows10的库。我在用后者编译时遇到了一些问题。下面是一些代码:

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....
    }
}
使用系统;
使用System.Collections.Generic;
#如果NET46
使用System.Windows;//。NET框架4.6
#elif NETCORE50
使用Windows.UI.Xaml;//Windows 10应用程序
#恩迪夫
公共静态类依赖
{
公共静态DependencyProperty寄存器(字符串名称、PropertyChangedCallback回调)
where TOwner:DependencyObject
{
//代码在这里。。。。
}
}
虽然这对于
net46
(传统的.NET框架)来说很好,但对于
netcore50
(Windows 10应用程序可以使用)来说,我很难让它正常工作。出于某种原因,该配置中似乎不包括
dependencProperty
DependencyObject
等类型

我是否可以安装一个兼容netcore50的NuGet软件包,其中包含这些类型,以便我可以从我的库中使用它们

谢谢你的帮助



编辑:我刚刚在VS中输入了
dependencProperty
,然后点击F12。该类型似乎存在于<强> Windows .Funtual.UnvialSalpCopule程序集中,但NuGet上没有这样的包。

WPF与.Net核心不兼容,也不兼容W10通用应用程序,据我所知,只有控制台应用程序和Web应用程序当前兼容.NETCARE,您应该仍然能够在新的项目系统中使用新的代码库,但是您需要从配置中删除.net核心,以便编译


如果您想将.net core与linux一起用于桌面应用程序,您只需等待,或者使用兼容的窗口应用程序框架(如果有),您应该能够使用html/js周围的跨平台框架,如Electron或Cordova(不确定是否有带有Cordova的桌面应用程序框架)我终于自己解决了这个问题!(如果您正在寻找快速答案,可能需要向下滚动。)

我偶然想起,有一堆特定于WinRT的库,比如
System.Runtime.WindowsRuntime
。所以,我去那里看看他们是怎么做到的

似乎他们使用某种内部托管的文件来实现这种效果,该文件包含一个
Windows.winmd
文件(该文件保存Windows运行时中的所有类型)。不幸的是,这个包托管在一个私有的NuGet提要上,只针对.NET核心团队,所以我不能使用它

我已经在CoreFX回购协议上就此提出了一个问题,因此我可以向微软申请正式解决这个问题。与此同时,我已经把事情掌握在自己的手中。我在我的笔记本电脑上找到了所有不同版本的
Windows.winmd
,并将它们作为NuGet软件包上传。这是:

您可以这样使用它们:

"frameworks": {
    ".NETPortable,Version=v4.5,Profile=Profile32": {
        "dependencies": {
            "Target.WindowsRuntime": "8.1.2"
        }
    }
}
在此之后,您将能够编写如下内容:

"frameworks": {
    ".NETPortable,Version=v4.5,Profile=Profile32": {
        "dependencies": {
            "Target.WindowsRuntime": "8.1.2"
        }
    }
}
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
公共类MyApp:应用程序
{
公共MyApp()
{
var按钮=新按钮();
button.Content=“你好,世界!”;
}
}

它会正常工作。

对于.NET Core 3及以上版本(现在处于预览版),您可以安装一个包含大多数WinRT类的软件包

非常确定这是不可能的-像WPF这样的东西不打算跨平台安装,尽管你可以研究像Perspex这样的项目,如果它们感兴趣的话。@Warty我认为你可以-.NET Core并不意味着你只能创建平台无关的库,它意味着可以创建它们。e、 g.你仍然可以使用像Microsoft.Win32.Registry这样的软件包。据我所知,Perspex是目前唯一的.NET核心UI库。不幸的是,我不认为这是真的。NetCore并不是写一些可以在任何平台上运行的东西,PCL就是这么做的。相反,它为您在project.json中指定的每个配置编译一次。这允许您在代码中执行类似于
#if NET46
的操作,并为每个平台专门化代码。WPF在.NET Core 3中受支持