【问题标题】:How can I make a .NET Core class library and reference it from a .NET 4.6 project?如何制作 .NET Core 类库并从 .NET 4.6 项目中引用它?
【发布时间】:2016-06-18 23:08:58
【问题描述】:

我想:

  • 制作一个定义一些接口和简单的通用帮助类的类库。它将依赖通用集合和IQueryable<T>,但不依赖第三方(嗯,JetBrains.Annotations)。
  • 能够从任何地方引用该类库(特别是 UWP、net46 和 ASP.Net Core RC2)
  • 理想情况下,始终使用 project.json 系统,但如果需要,我准备牺牲它。
  • 将完成的库发布到 NuGet 源,然后在其他应用程序中使用它

在 Visual Studio 2015.2 中创建我的类库项目时,我找到了 Class Library (.NET Core) 模板,其中指出

用于将类库创建为可面向任何平台的 NuGet 包的项目模板

任何平台!太棒了......但我无法让它工作。经过一番摆弄,我目前有以下project.json(我现在可能已经完全破解了):

{
"title": "My Really Useful Class Library",
"copyright": "Copyright © 2015-16 Tigra Astronomy, all rights reserved",
"description": "Really neat stuff",
"language": "en-GB",
"version": "1.0.0-*",
"dependencies": {
    "JetBrains.Annotations": "10.1.4",
    },
"frameworks": {
    "netstandard1.5": {
        "imports": "dnxcore50",
        "dependencies": {
            "NETStandard.Library": "1.5.0-rc2-24027",
            "System.Linq.Expressions": "4.0.11-rc2-24027"
            }
        }
    "net46": {
        "frameworkAssemblies": {
            "System.Collections": "4.0.*"
            },
        "dependencies": {}
        }
    },
    "buildOptions": {
        "xmlDoc": true
        }
}

接下来我在同一个解决方案中创建了我的 .NET Framework 4.6 项目,并尝试引用类库。它让我可以添加引用,但我遇到了构建错误、未解析的符号、R# 不满意等。

我想我做得不对(真的,这并不奇怪,因为我在黑暗中摸索)。

我已经阅读了一些关于 TFM、框架和库的文档,但没有一个真正有意义。

我真正需要在我的类库的project.json 中添加什么,以便我可以从我的 .net framework 4.6 应用程序以及 UWP 和 ASP.NET Core RC2 应用程序中引用它?这真的是正确的方法还是我一开始就走错了路?

【问题讨论】:

  • 请原谅我还没有选择“正确”的答案。我仍在处理一些升级到最新 RTM 版本和最新预览工具的方案。
  • 确保检查你的cs项目中的<Project ToolsVersion="14.0" 元素。如果您没有在引用项目中使用该版本,VS 似乎不会加载工具来处理 .net 核心引用。

标签: asp.net-core compatibility .net-core project.json


【解决方案1】:

目前有两种创建 C# 项目的方法:xprojcsproj。假设我们对它们都使用了project.json,对于项目类型来说,这仍然是不同的——对于xprojproject.json 包含构建项目所需的一切;对于csproj,它只包含 nuget 依赖项。

也就是说,由于需要比xproj/project.json 支持的更复杂的构建管道,某些项目类型(如 UWP)无法使用 xproj 构建。 (顺便说一句,这是回到 msbuild 的一个关键原因。)

还有两种创建基于 .NET Standard 的类库的方法:您可以使用 xprojproject.json,就像您所做的那样,或者您可以创建一个常规的 csproj“可移植类库”项目。使用 VS 2015 Update 3 RC,您可以更改 PCL 以针对 .NET Standard 版本(netstandard1.x 而不是 PCL 配置文件、259 等)。

如果您使用基于csproj 的类库来定位netstandard1.x,则在添加项目引用时应该可以正常工作。请注意,基于platform map,UWP 目前支持最多netstandard1.4。挑战在于,如果您想改用基于xproj/project.json 的项目。今天使用xproj 的一个关键原因是启用多个目标框架之间的交叉编译。也就是说,从您的项目中创建多个输出。这与创建可以从任何兼容项目引用的单个输出不同。各有各的用途,看你的需要。

如果您决定创建基于 xproj 的类库,如果“添加引用”对话框不起作用(它不像csproj->xproj 几乎坏了)。不要使用对话框,而是编辑您的 UWP csproj 以指向 xproj 的输出,如下所示:

<Reference Include="System.Reactive.Interfaces">
  <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath>
</Reference>

以上sn-p取自Rx.NET UWP Test Runnerhere

如果您这样做,您还需要将 UWP 项目中的构建依赖项添加到您的 xproj,因为 MSBuild/Visual Studio 不会知道它并以错误的顺序构建事物。为此,请在解决方案资源管理器中右键单击您的 UWP 项目,然后选择“构建依赖项 -> 项目依赖项”。在该对话框中,选中您的 xproj 的复选框,以确保 VS/MSbuild 知道要先构建那个。

您可以在此处查看完整的 Rx.NET 解决方案,其中包括我上面提到的 xproj-&gt;xproj 引用和 UWP -> xproj 引用。

【讨论】:

  • 谢谢 Oren,现在开始有点意思了。我也可以开始理解为什么 MS 说“等待新工具”。也许我应该尝试 VS2015.3 RC...我可能确实希望我的库最终在 IoT Core 下基于 UWP/ARM 的目标上工作,因此我希望使用 xproj。
  • 如果您的目标是与 UWP 和 ASPNet Core 1.0 兼容并且您只想要一个输出,那么最简单的方法可能是针对 netstandard1.4csproj。您不需要xproj,这样可以更轻松地进行项目到项目的引用。
  • 哦,事实上我可以在 2015 Update 2 中看到那个链接... 2015.3 RC 在这个阶段值得安装吗?因为它是一个 RC,它应该相当稳定......
  • 当我将 PCL 更改为面向 .NETStandard1.5 时,我无法安装 JetBrains.Annotations - 在包还原期间,我收到一条错误消息,指出“AnyCPU”与项目的其中一个不兼容目标。将构建配置更改为“x86”似乎没有帮助。相反,我可以将该包安装到我的基于 .NETCore 的库中,该库也以 NetStandard1.5 为目标。又一个谜!这是工具问题还是某些限制?
  • 据我了解,尽管在 Update 2 中可用,但在 PCL 项目类型中使用 .NETStandard 效果不佳。它应该在更新 3 中工作得更好。如果您需要引入非网络标准依赖项,那么您需要在目标框架中使用 imports 语句来覆盖 NuGet 兼容性检查并强制导入。
【解决方案2】:

新项目模板/.xproj 的工作方式略有不同。新的类库(和应用程序模板)生成 nuget 包,而不是普通程序集。

在该 nuget 包中,所有目标都打包到其中。话虽如此,添加新项目的方式与添加任何其他 nuget 包的方式相同:将 nuget 放入 nuget 提要中,在 Visual Studio 中引用它,然后从那里获取它。

如果您没有运行 nuget 服务器(Visual Studio Team Services + NuGet 包、myget、自托管),您还可以将包放入文件夹(本地或网络共享)并将此文件夹添加为 nuget资源。

如果这“太多”工作,您还可以在一个文件夹中创建两个项目:一个 *.csproj 和一个 *.xproj。 *.csproj 以 .NET 4.6 框架为目标,而 *.xproj 保持如您在上面指出的那样,并且具有多个目标。使用此设置,您通常可以通过简单地添加引用来以之前使用的方式引用项目(如果它们在同一个解决方案中)。

【讨论】:

  • 新模板默认不生成 nuget 包。这是 DNX/RC1 的一部分,但 RC2 项目模板不会在 VS 中自动执行此操作。你必须运行 dotnet pack 来创建包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多