如何创建.NET Core类库并从.NET 4.6项目引用它?

时间:2016-06-18 23:08:59

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

我想:

  • 创建一个定义一些接口和简单通用助手类的类库。它依赖于泛型集合和IQueryable<T>,但没有第三方依赖(好吧,JetBrains.Annotations)。
  • 能够从任何地方引用该类库(特别是UWP,net46和ASP.Net Core RC2)
  • 理想情况下,尽可能使用project.json系统,尽管如果需要,我准备牺牲它。
  • 将完成的库发布到NuGet Feed,并从那里将其用于其他应用

在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应用程序中引用它?这真的是正确的方法,还是我开始走错了路?

2 个答案:

答案 0 :(得分:33)

现在有两种方法可以创建C#项目:xprojcsproj。假设我们对它们使用project.json,对于项目类型仍然有不同的作用 - 对于xprojproject.json包含构建项目所需的所有内容;对于csproj,它只包含nuget依赖项。

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

还有两种创建基于.NET标准的类库的方法:您可以将xprojproject.json一起使用,或者您可以创建常规{{ 1}}&#34;便携式类库&#34;项目。使用VS 2015 Update 3 RC,您可以将PCL更改为针对.NET标准版本(csproj而不是PCL配置文件,259等)。

如果您使用基于netstandard1.x的类库来定位csproj,那么在添加项目引用时,事情应该适合您。请注意,根据platform map,UWP目前最多支持netstandard1.x。如果您想使用基于netstandard1.4 / xproj的项目,则面临挑战。今天使用project.json的一个关键原因是在多个目标框架之间启用交叉编译。也就是说,从项目中创建多个输出。这与创建可从任何兼容项目引用的单个输出不同。两者都有其用途,这取决于您的需求。

如果您决定创建一个基于xproj的类库,那么可以使用一种解决方法来从UWP项目或任何其他兼容的项目类型中引用它,如果&#34;添加引用&# 34;对话框不起作用(它不像xproj - &gt; csproj几乎被打破了。不要使用对话框,而是编辑您的UWP xproj以指向csproj的输出,如下所示:

xproj

以上代码段取自Rx.NET UWP Test Runner here

如果你这样做,你还需要从你的UWP项目中添加构建依赖项到你的xproj,因为MSBuild / Visual Studio不知道它并以错误的顺序构建东西。为此,在解决方案资源管理器中右键单击您的UWP项目,然后选择&#34; Build Dependencies - &gt;项目依赖&#34;。在该对话框中,选中xproj的复选框,以确保VS / MSbuild首先知道构建该工具。

您可以在此处查看完整的Rx.NET解决方案,其中包括<Reference Include="System.Reactive.Interfaces"> <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath> </Reference> 个引用和UWP - &gt;我在上面提到的xproj->xproj个引用。

答案 1 :(得分:3)

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

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

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

如果“太”工作,您还可以在一个文件夹中创建两个项目:A * .csproj和* .xproj。 * .csproj以.NET 4.6 Framework为目标,* .xproj保持如上所述并具有多个目标。通过此设置,您可以通过简单地添加引用,通常以之前使用的方式引用项目(如果它们位于相同的解决方案中)。