如何在.NET Core库中使用Windows运行时类?

时间:2016-02-08 19:08:12

标签: c# asp.net .net windows-runtime asp.net-core

我正在开发一个用于WPF和Windows 10的库。我遇到了让它在后者上编译的问题。以下是一些代码:

project.json

msvcrt

Dependency.cs

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

虽然这对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)编译很好,但是我无法让它适用于net46(可以由Windows 10应用程序使用)。出于某种原因,看起来像netcore50DependencyProperty这样的类型不包含在该配置中。

我可以安装一个DependencyObject兼容的NuGet包,它包含这些类型,所以我可以在我的库中使用它们吗?

感谢您的帮助。

编辑:我刚刚在VS中键入了netcore50并点击了F12。看来该类型存在于 Windows.Foundation.UniversalApiContract 程序集中,但NuGet上没有这样的包。

3 个答案:

答案 0 :(得分:6)

终于解决了我自己的问题! (如果您正在寻找快速回答,可能需要向下滚动。)

我很遗憾地记得.NET Core GitHub repo有一堆特定于WinRT的库,比如System.Runtime.WindowsRuntime。所以,我去那里看他们是怎么做到的。

它们似乎使用某种内部托管的"targeting pack",它包含一个Windows.winmd文件(包含Windows运行时中的所有类型),以实现此效果。不幸的是,该软件包托管在仅供.NET Core团队使用的私有NuGet Feed中,因此我无法使用它。

我已经在CoreFX repo here上打开了一个关于此的问题,因此我可以请求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!";
    }
}

它就会起作用。

答案 1 :(得分:0)

WPF与.net Core兼容也不兼容W10 Universal Apps,据我所知,控制台应用和网络应用目前与.net核心兼容,您应该仍然可以使用新的代码库项目系统,但您需要从配置中删除.net核心才能进行编译 如果你想在桌面应用程序中使用带有linux的.net核心,你只需要等待,或者使用兼容的窗口应用程序框架(如果有的话),你应该能够使用基于html的跨平台框架/像Electron或Cordova这样的js(关于是否有与Cordova的桌面应用程序框架不确定)

答案 2 :(得分:0)

在.NET Core 3及更高版本(现已预览)中,您可以安装一个软件包,其中包括大多数WinRT类Microsoft.Windows.SDK.Contracts