我正在开发一个用于WPF和Windows 10的库。我遇到了让它在后者上编译的问题。以下是一些代码:
project.json
msvcrt
Dependency.cs
{
"frameworks": {
"net46": {
"frameworkAssemblies": {
"WindowsBase": "4.0.0.0"
}
},
"netcore50": {
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0"
}
}
}
}
虽然这对using System;
using System.Collections.Generic;
#if NET46
using System.Windows; // .NET Framework 4.6
#elif NETCORE50
using Windows.UI.Xaml; // Windows 10 apps
#endif
public static class Dependency
{
public static DependencyProperty Register<T, TOwner>(string name, PropertyChangedCallback<T, TOwner> callback)
where TOwner : DependencyObject
{
// Code here....
}
}
(传统的.NET Framework)编译很好,但是我无法让它适用于net46
(可以由Windows 10应用程序使用)。出于某种原因,看起来像netcore50
或DependencyProperty
这样的类型不包含在该配置中。
我可以安装一个DependencyObject
兼容的NuGet包,它包含这些类型,所以我可以在我的库中使用它们吗?
感谢您的帮助。
编辑:我刚刚在VS中键入了netcore50
并点击了F12。看来该类型存在于 Windows.Foundation.UniversalApiContract 程序集中,但NuGet上没有这样的包。
答案 0 :(得分:6)
终于解决了我自己的问题! (如果您正在寻找快速回答,可能需要向下滚动。)
我很遗憾地记得.NET Core GitHub repo有一堆特定于WinRT的库,比如System.Runtime.WindowsRuntime
。所以,我去那里看他们是怎么做到的。
它们似乎使用某种内部托管的"targeting pack",它包含一个Windows.winmd
文件(包含Windows运行时中的所有类型),以实现此效果。不幸的是,该软件包托管在仅供.NET Core团队使用的私有NuGet Feed中,因此我无法使用它。
我已经在CoreFX repo here上打开了一个关于此的问题,因此我可以请求Microsoft正式解决此问题。与此同时,我已经掌握了自己的事情。我在笔记本电脑上找到了Windows.winmd
的所有不同版本,并将其作为NuGet包上传。他们在这里:
您可以像这样使用它们:
"frameworks": {
".NETPortable,Version=v4.5,Profile=Profile32": {
"dependencies": {
"Target.WindowsRuntime": "8.1.2"
}
}
}
之后,您将能够编写如下内容:
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
public class MyApp : Application
{
public MyApp()
{
var button = new Button();
button.Content = "Hello, world!";
}
}
它就会起作用。
答案 1 :(得分:0)
WPF与.net Core兼容也不兼容W10 Universal Apps,据我所知,控制台应用和网络应用目前与.net核心兼容,您应该仍然可以使用新的代码库项目系统,但您需要从配置中删除.net核心才能进行编译 如果你想在桌面应用程序中使用带有linux的.net核心,你只需要等待,或者使用兼容的窗口应用程序框架(如果有的话),你应该能够使用基于html的跨平台框架/像Electron或Cordova这样的js(关于是否有与Cordova的桌面应用程序框架不确定)
答案 2 :(得分:0)
在.NET Core 3及更高版本(现已预览)中,您可以安装一个软件包,其中包括大多数WinRT类Microsoft.Windows.SDK.Contracts