【问题标题】:Why isn't this .NET Core package compatible with my PCL?为什么这个 .NET Core 包与我的 PCL 不兼容?
【发布时间】:2015-12-26 06:33:01
【问题描述】:

我有一个针对以下平台的 PCL:

  • .NET Framework 4.5
  • Windows 8
  • Windows Phone 8.1

我还有一个基于 .NET Core 和 project.json 的包(称为 Enu),我想在这个 PCL 中使用它。我的问题是,当我尝试将 .NET Core 包安装到我的 PCL 中时,我收到一条错误消息,指出 PCL 与该包不兼容。

PM> Install-Package Enu
# lots of output...
Install failed. Rolling back...
Package 'Enu 4.4.0' does not exist in project 'PclDummy'
Package 'Enu 4.4.0' does not exist in folder 'C:\Users\James\Documents\Visual Studio 2015\Projects\PclDummy\packages'
Install-Package : Could not install package 'Enu 4.4.0'. You are trying to install this package into a project that targets '.NETPortable,Version=v4.5,Profile=Profile111', but the package does not contain 
any assembly references or content files that are compatible with that framework. For more information, contact the package author.

在深入研究了这个问题之后,我发现 Enu 所依赖的包,特别是 System.Runtime (v4.0.0),在我的 PCL 上安装时似乎也有问题 (related post)。奇怪的是,虽然它声称与我的库不兼容,但它 supports all of the target platforms I do,所以我不明白为什么会这样。


TL;DR: NuGet 不允许在 PCL 上安装 .NET Core 包,因为它认为它们不兼容。经过调查,我发现问题的根源是包的依赖项与 PCL 不兼容,尽管 it supports all of the platforms 我的 PCL 确实如此。为什么会这样?

这是 .NET Core 包的 project.json 文件,我做错了吗?

【问题讨论】:

  • @Claies 哎呀,不小心链接到我的主分支上的 project.jsonHere 是撰写本文时的样子。
  • 无论如何,我的评论有点快;我还在研究这个问题

标签: c# asp.net .net nuget asp.net-core


【解决方案1】:

不支持您正在尝试的内容,因为您正在创建一个仅允许 .NET 4.5、Windows 8 和 Windows Phone 8.1 的公共子集的 PCL,并且您正在尝试添加对此 PCL 的引用,即您允许的 API 的超集。这会产生冲突,因为 Enu 包可能使用 .NET 4.5、Windows 8 和/或 Windows Phone 8.1 上不可用的 API。

要使用 .NET Core 库,您必须创建一个 .NET 4.5 库或使用 Enu 库的替代品,该库本身就是一个使用相同的 PCL(.NET 4.5、Windows 8 , Windows Phone 8.1) 或 .NET API 的较小子集(.NET 4.5、Windows 8、Windows Phone 8.1 和例如 Windows Phone 8 Silverlight)。

编辑:看一下你的 NuGet 包就会发现,你有一个针对 .NET 4.5、Windows 8 和 Windows Phone 8.1 的库,但是你对所有平台都有不同的程序集,但是你需要使用它PCL 中的单个程序集可以跨所有平台使用。 NuGet 平台标识符将为“portable-net45+win+wpa81”。

【讨论】:

  • 感谢您的回答,发现它真的很有帮助!不过有一件事:既然 Enu 以上述平台为目标 (net45+win+wpa81),它怎么可能使用这些平台上不可用的 API?它不是 PCL 使用的 API 的子集吗?
  • .NET Core 是 .NET 4.5 的子集,但仍然是 Windows 8 和 Windows Phone 8.1 的超集。因此,当您编写仅使用 .NET 4.5、Windows 8 和 Windows Phone 8.1 的公共子集的 PCL 时,您使用的是 .NET Core 5 的子集。这也意味着 .NET Core 5 包含不适用于Windows 8 或 Windows Phone 8.1。 .NET Core 包含 System.Security.Cryptography,但适用于 Windows 8.1 的 .NET 不包含。还有其他不可用的命名空间,但这应该会给你一些提示。
  • 终于在尝试了编辑中的建议后得到了它,非常感谢!我会在 9 小时内给你赏金。
【解决方案2】:

在 project.json 中定位 dotnet 将不包括 Windows 8 和 Windows Phone 8.1。尝试在您的目标框架中添加netcore45wpa81

【讨论】:

  • 您好,感谢您的回答!您似乎是这里为数不多的了解 .NET Core 的人之一。我尝试了您的建议并添加了适用于 Windows 8 + Windows Phone 8.1 (new project.json) 的 TFM,但我遇到了同样的错误。你能帮帮我吗?
  • 我正在开发一个基于 ASP.NET 5 的新项目,因此我需要对其进行大量阅读/挖掘(包括 .NET Core)。不像团队中的那些人那样知识渊博,但我很乐意提供帮助并分享我迄今为止所知道的。无论如何,您如何在 PCL 中引用 Enu 包?你有私人 nuget 仓库吗?
  • 不是真的;我将其上传到 nuget.org,然后从我的 PCL 执行 Install-Package Enu
【解决方案3】:

好吧,经过三周的努力,我终于(FINALLY)解决了这个问题。这是我的新工作project.json

{
    ...

    "frameworks": {
        "dotnet": {
            "dependencies": {
                "System.Runtime": "4.0.20"
            }
        },
        ".NETPortable,Version=v4.5,Profile=Profile111": {
            "frameworkAssemblies": {
                "System.Runtime": ""
            }
        }
    }
}

感谢 Mark 给了我这个想法以及 these guys 是谁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-01-02
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    相关资源
    最近更新 更多