C# 如何从.NET核心库引用Windows.winmd?

C# 如何从.NET核心库引用Windows.winmd?,c#,.net,windows-runtime,asp.net-core,dnx,C#,.net,Windows Runtime,Asp.net Core,Dnx,我希望使用.NET核心库中的Windows运行时类型,如框架或按钮。当我使用传统的PCL,针对Windows/WindowsPhone8.1时,它似乎工作得很好。然而,由于某种原因,在我将项目切换到DNX之后,它就不再编译了 这是我的project.json: { "frameworks": { // Profile32 == Windows + Windows Phone 8.1 ".NETPortable,Version=v4.6,Profile=Pr

我希望使用.NET核心库中的Windows运行时类型,如
框架
按钮
。当我使用传统的PCL,针对Windows/WindowsPhone8.1时,它似乎工作得很好。然而,由于某种原因,在我将项目切换到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>();
    }
}
不幸的是,这似乎也不起作用,尽管编译器在解析像
System.Linq
System.Runtime

这样的程序集时没有问题

配置文件32的目标是“Windows 8.1、Windows Phone 8.1”(=平台标准1.2)

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

因此,如果您想在“类库(包)”中支持/使用winmd,则需要使用net(针对完整的.net framework时)和dotnet(针对.net核心框架时)名字对象

从上面的.NET平台标准链接:

VS2013和VS2015中的现有PCL项目(不包括UWP目标)只能针对.NET平台标准版本1.2

我不确定这是否也适用于.winmd文件。但您可以尝试将.NET核心的
dotnet51
dotnet52
dotnet53
作为目标。您不能使用.NET 4.6(
dotnet54
dotnet55
名字对象)而仍然以Windows 8.1为目标,这只适用于UWP。根据a的说法,这些版本被关闭了一个(因此
dotnet51
等于
netstandard1.0
dotnet5.5
等于
netstandard1.4

名字对象的名称似乎适用于即将发布的ASP.NET Core 1.0 RC2版本,而对于当前的RC1,您可能仍然需要应用
dotnet
名字对象

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

请记住,对于类库(包),您必须使用名字对象,而对于.NET核心应用程序和测试项目,您仍然使用“dnx”和“dnxcore”


现在是一团糟,但下一次RC2应该会更好。。。我希望我找到了答案

诀窍是将您的项目基于csproj而不是xproj,您可以通过以下步骤来完成

完成此操作后,只需转到项目的属性并将库重新定位到Windows 8.1和Windows Phone 8.1。然后,您将看到Windows的小组装图标弹出,如下所示:


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

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