[英]How to reference Windows.winmd from a .NET Core library?
我希望使用.NET Core库中的Windows运行时类型,例如Frame
或Button
。 当我使用针对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
程序集中,该程序集可在程序文件中找到。 我很好奇,我可以通过.NET Core库引用此程序集吗?
谢谢!
(请注意,我不能只使用常规PCL,因为我有特定于.NET Core的需求。)
meta:顺便说一句,请不要从这个问题中删除asp.net-core
标记,因为这与DNX有关。
编辑:我刚刚尝试过:
".NETPortable,Version=v4.6,Profile=Profile32": {
"frameworkAssemblies": {
"Windows": { "type": "build" }
}
}
不幸的是,尽管编译器在解析诸如System.Linq
或System.Runtime
类的程序集时都没有问题,但这似乎也不起作用。
框架标记(TFM)有点令人困惑。
配置文件32的目标是“ Windows 8.1,Windows Phone 8.1”(= 1.2的平台标准)。
标准越低,平台可以使用的类库越多,但功能最少。 标准越高,可以使用的功能越多,但是平台可能会受到限制。
因此,如果要在“类库(程序包)”中支持/使用winmd,则需要使用net(当针对完整的.NET框架时)和dotnet(当针对.NET核心框架时)绰号。
通过上面的.NET平台标准链接:
VS2013和VS2015中的现有PCL项目(不包括UWP目标)只能定位到.NET Platform Standard 1.2以下版本。
我不确定这是否也适用于.winmd文件。 但是您可以尝试将.NET Core定位为dotnet51
, dotnet52
或dotnet53
。 您不能使用.NET 4.6( dotnet54
和dotnet55
绰号),但仍以Windows 8.1为目标,这仅适用于UWP。 根据Marc Garvell的帖子,版本之间dotnet51
一个(因此dotnet51
等于netstandard1.0
, dotnet5.5
等于netstandard1.4
)
似乎这些名称的名称适用于即将发布的ASP.NET Core 1.0 RC2版本,而对于当前的RC1,您可能仍必须应用dotnet
。
当然,您可以针对多个框架(对于定义的每个框架,将编译一个程序集),但是您必须使用预处理程序指令从代码中删除winmd / win8.1类,并用在较新的平台。
请记住,对于类库(包),您必须使用“ net”和“ dotnet”绰号,而对于.NET Core应用程序和测试项目,您仍应使用“ dnx”和“ dnxcore”。
现在是一团糟,但是下一个RC2应该会更好...我希望
好吧,看来我找到了答案。
诀窍是使您的项目基于csproj而不是xproj,您可以按照此处的步骤进行操作。
完成此操作后,只需转到项目的属性,然后将库重新定位到Windows 8.1和Windows Phone 8.1。 然后,您将看到弹出用于Windows的小程序集图标,如下所示:
在netcoreapp3.0
库中添加对Microsoft.Windows.SDK.Contracts
的netcoreapp3.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.