如何从 .NET Core 库中引用 Windows.winmd?
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
的程序集中,该程序集位于 Program Files 中的某个位置。我很想知道,有没有什么方法可以从我的 .NET Core 库中引用这个程序集?
谢谢!
(请注意,我不能只使用常规 PCL,因为我有特定于 .NET Core 的需求。)
meta: 顺便说一下,请不要从这个问题中删除 asp.net-core
标签,因为这与 DNX 有关。
编辑: 我刚试过这个:
".NETPortable,Version=v4.6,Profile=Profile32": {
"frameworkAssemblies": {
"Windows": { "type": "build" }
}
}
不幸的是,这似乎也不起作用,尽管编译器在解析像 System.Linq
或 System.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 文件。但是您可以尝试将 dotnet51
、dotnet52
或 dotnet53
作为 .NET Core 的目标。您不能使用 .NET 4.6(dotnet54
和 dotnet55
名字对象)并且仍然以 Windows 8.1 为目标,这仅适用于 UWP。根据 post of Marc Garvell 版本相差一个(所以 dotnet51
等于 netstandard1.0
而 dotnet5.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
的引用
我希望使用 .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
的程序集中,该程序集位于 Program Files 中的某个位置。我很想知道,有没有什么方法可以从我的 .NET Core 库中引用这个程序集?
谢谢!
(请注意,我不能只使用常规 PCL,因为我有特定于 .NET Core 的需求。)
meta: 顺便说一下,请不要从这个问题中删除 asp.net-core
标签,因为这与 DNX 有关。
编辑: 我刚试过这个:
".NETPortable,Version=v4.6,Profile=Profile32": {
"frameworkAssemblies": {
"Windows": { "type": "build" }
}
}
不幸的是,这似乎也不起作用,尽管编译器在解析像 System.Linq
或 System.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 文件。但是您可以尝试将 dotnet51
、dotnet52
或 dotnet53
作为 .NET Core 的目标。您不能使用 .NET 4.6(dotnet54
和 dotnet55
名字对象)并且仍然以 Windows 8.1 为目标,这仅适用于 UWP。根据 post of Marc Garvell 版本相差一个(所以 dotnet51
等于 netstandard1.0
而 dotnet5.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
的引用