如何从 .NET Core 库中引用 Windows.winmd?

How to reference Windows.winmd from a .NET Core library?

我希望使用 .NET Core 库中的 Windows 运行时类型,例如 FrameButton。当我使用针对 Windows/Windows Phone 8.1 的传统 PCL 时,它似乎工作正常。然而,出于某种原因,我将项目切换到 DNX 后,它没有编译。

这是我的 project.json:

{
    "frameworks": {
        // Profile32 == Windows + Windows Phone 8.1
        ".NETPortable,Version=v4.6,Profile=Profile32": { }
    }
}

这是我的示例代码:

using System.Linq;
using Windows.UI.Xaml.Controls;

public class Sample
{
    public void Method()
    {
        Enumerable.Empty<Frame>();
    }
}

在此代码段中,我在 Frame 上遇到编译器错误,提示找不到该类型。因此,我对此做了一些侦探工作,并在我的常规 PCL 中按 F12 键查看它的声明程序集。

事实证明,我想要的大多数 Windows 运行时类型都存在于一个名为 Windows.winmd 的程序集中,该程序集位于 Program Files 中的某个位置。我很想知道,有没有什么方法可以从我的 .NET Core 库中引用这个程序集?

谢谢!

(请注意,我不能只使用常规 PCL,因为我有特定于 .NET Core 的需求。)


meta: 顺便说一下,请不要从这个问题中删除 asp.net-core 标签,因为这与 DNX 有关。


编辑: 我刚试过这个:

".NETPortable,Version=v4.6,Profile=Profile32": {
    "frameworkAssemblies": {
        "Windows": { "type": "build" }
    }
}

不幸的是,这似乎也不起作用,尽管编译器在解析像 System.LinqSystem.Runtime.

这样的程序集时没有问题

The framework moniker (TFM)有点混乱。

Profile 32 目标 "Windows 8.1, Windows Phone 8.1"(=1.2 的平台标准)。

标准越低,可以使用 class 库的平台就越多,但它们具有的功能最少。标准越高,可以使用的功能越多,但平台可能会受到限制。

因此,如果您想在 "Class Library (package)" 中 support/use 一个 winmd,您需要使用 net(针对完整的 .NET 框架时)和 dotnet(针对 .NET 核心框架时) ) 绰号。

来自上面的 .NET 平台标准 link:

Exising PCL projects in VS2013 and VS2015 (excluding UWP targets), can only target up to .NET Platform Standard version 1.2.

我不确定这是否也适用于 .winmd 文件。但是您可以尝试将 dotnet51dotnet52dotnet53 作为 .NET Core 的目标。您不能使用 .NET 4.6(dotnet54dotnet55 名字对象)并且仍然以 Windows 8.1 为目标,这仅适用于 UWP。根据 post of Marc Garvell 版本相差一个(所以 dotnet51 等于 netstandard1.0dotnet5.5 等于 netstandard1.4

似乎绰号的名称是为即将到来的 ASP.NET Core 1.0 RC2 版本和当前的 RC1 版本,您可能仍然需要应用 dotnet 绰号。

当然你可以针对多个框架(对于定义的每个框架,将编译一个程序集),但是你必须使用预处理器指令来删除你的 winmd/win8.1 classes从您的代码中替换它,并将其替换为适用于较新平台的内容。

请记住,对于 Class 库(包),您必须使用 "net" and "dotnet" 绰号,而对于 .NET Core 应用程序和测试项目,您仍然使用 "dnx" 和 "dnxcore".

现在一团糟,但下一个 RC2 应该会好得多...我希望

嗯,看来我找到答案了。

诀窍是将您的项目基于 csproj 而不是 xproj,您可以按照 .

的步骤进行操作

完成后,只需转到项目的属性并将库重新定位到 Windows 8.1 和 Windows Phone 8.1。然后你会看到弹出 Windows 的小程序集图标,如下所示:

netcoreapp3.0 库中添加对 Microsoft.Windows.SDK.Contracts 的引用