【问题标题】:How to use Windows Runtime classes in .NET Core libraries?如何在 .NET Core 库中使用 Windows 运行时类?
【发布时间】:2016-02-08 19:08:12
【问题描述】:

我正在开发一个用于 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 框架)编译得很好,但我无法让它为 netcore50(可用于 Windows 10 应用程序)工作。出于某种原因,该配置中似乎不包含 DependencyPropertyDependencyObject 之类的类型。

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

感谢您的帮助。


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

【问题讨论】:

  • 很确定这是不可能的——像 WPF 这样的东西并不打算跨平台 afaik,不过如果你感兴趣的话,你可以看看像 Perspex 这样的项目。
  • @Warty 我认为你可以 - .NET Core 并不意味着你只能创建与平台无关的库,这意味着可以创建它们。例如你仍然可以使用像Microsoft.Win32.Registry 这样的包。

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


【解决方案1】:

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

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

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

我已经在 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!";
    }
}

它会起作用的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      WPF 不兼容 .net Core 也不兼容 W10 通用应用程序,据我所知,目前只有控制台应用程序和 Web 应用程序与 .net 核心兼容,您应该仍然可以使用新的代码库和新的项目系统,但您需要从配置中删除 .net core 才能编译 如果您想将 .net core 与 linux 与桌面应用程序一起使用,您只需等待,或使用兼容的窗口应用程序框架(如果有的话),您应该能够使用围绕 html/ 的跨平台框架基础js,例如 Electron 或 Cordova(不确定是否有带有 Cordova 的桌面应用程序框架)

      【讨论】:

      • 据我所知,Perspex 是目前唯一的 .NET Core UI 库。
      • 不幸的是,我认为这不是真的。 .NET Core不是关于编写可以在每个平台上运行的东西,这就是 PCL 所做的。相反,它会为您在 project.json 中指定的每个配置编译一次。这允许您在代码中执行 #if NET46 之类的操作,并针对每个平台专门化您的代码。
      • .NET Core 3 支持 WPF
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多