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

问题描述 投票:10回答:3

我正在开发一个用于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应用程序使用)。出于某种原因,它看起来像DependencyPropertyDependencyObject这样的类型不包含在该配置中。

是否有我可以安装的netcore50兼容的NuGet包,包含这些类型,所以我可以从我的库中使用它们?

谢谢你的帮助。


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

c# asp.net .net windows-runtime asp.net-core
3个回答
6
投票

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

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

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

我在CoreFX repo here上打开了一个关于此的问题,所以我可以请求微软公司正式解决这个问题。与此同时,我已经掌握了自己的事情。我在笔记本电脑上找到了所有不同版本的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
投票

使用.NET Core 3及更高版本(现在预览版),您可以安装一个包含大多数WinRT类的包Microsoft.Windows.SDK.Contracts


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.