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

我希望从.NET Core库中使用Windows运行时类型,如FrameButton 。 当我使用传统的PCL(针对Windows / Windows Phone 8.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上遇到编译器错误,说无法找到该类型。 所以,我做了一些关于这方面的侦探工作,并在我的常规PCL上点击了F12,看看它的声明组件。

事实certificate,我想要的大多数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等程序集时没有问题。

框架名字对象(TFM)有点令人困惑。

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

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

因此,如果您想在“类库(包)”中支持/使用winmd,则需要使用网络(针对完整的.NET框架时)和dotnet(针对.NET核心框架时)的标记。

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

在VS2013和VS2015中排除PCL项目(​​不包括UWP目标),只能达到.NET Platform Standard 1.2版。

我不确定这是否也适用于.winmd文件。 但是你可以尝试的东西是针对.NET Core的dotnet51dotnet52dotnet53 。 您不能使用.NET 4.6( dotnet54dotnet55标记)并仍然以Windows 8.1为目标,这只适用于UWP。 根据Marc Garvell的post,版本是一个版本(因此dotnet51等于netstandard1.0dotnet5.5等于netstandard1.4

看起来monikers的名字是针对即将推出的ASP.NET Core 1.0 RC2版本,对于当前的RC1,您可能仍然需要应用dotnet标记。

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

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

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

好吧,看起来我找到了答案。

诀窍是将您的项目基于csproj而不是xproj,您可以按照此处的步骤进行操作。

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