2016-06-18 42 views
19

我想:如何制作.NET Core类库并从.NET 4.6项目中引用它?

  • 做一个类库,它定义了一些界面和简单的通用助手类。它将依靠通用集合和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#是不开心,等等。

我想我没做对(没有意外,真的,因为我在摸索中黑暗)。

我读过一些关于TFMs,框架和库的文档,但没有一个真正有意义。

我真的需要在我的课程库project.json中放入什么东西,以便我可以从我的.net framework 4.6应用程序以及UWP和ASP.NET Core RC2应用程序中引用它?这真的是正确的做法,还是我开始走错了路?

+0

请原谅我没有选择'正确'的答案呢。我仍在通过升级到最新RTM版本和最新预览工具的许多方案。 –

+1

确保在cs proj中检查了 StingyJack

回答

3

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

在那个nuget包中,所有的目标都被打包进去。话虽如此,您添加新项目的方式与添加其他nuget软件包的方式相同:将nuget放入Nuget Feed中,在Visual Studio中引用此项,然后从此处获取它。

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

如果这“工作太多”,也可以在一个文件夹中创建两个项目:* .csproj和* .xproj。 * .csproj的目标是.NET 4.6框架,* .xproj保持如上所述并有多个目标。通过这种设置,您通常可以按照以前使用的方式(如果它们处于相同的解决方案中)引用项目,只需添加一个参考即可。

+3

默认情况下,新模板不会生成nuget软件包。这是DNX/RC1的一部分,但RC2项目模板不会在VS中自动执行此操作。你必须运行'dotnet pack'来创建软件包。 –

35

现在有两种创建C#项目的方式:xprojcsproj。假设我们对它们都使用project.json,对于项目类型,这仍然有不同的效果 - 对于xprojproject.json包含构建项目所需的一切;对于csproj,它只包含nuget依赖关系。

也就是说,有些项目类型(如UWP)不能用xproj构建,因为需要比支持更复杂的构建管道。 (顺便说一句,这是一个关键的原因搬回的MSBuild。)

也有创造一个基于标准的.NET类库的两种方法:你可以使用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的类库,如果“添加引用”对话框不工作(它不会工作),您可以使用一种解决方法从UWP项目或任何其他兼容项目类型引用它't为csproj - >xproj已经非常糟糕了)。除了使用对话框中,编辑您UWP csproj指向xproj这样的输出:

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

上面的代码从Rx.NET UWP测试运行here

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

您可以在这里看到完整的Rx.NET解决方案,其中包括xproj->xproj参考文献和我在上面提到的UWP - >xproj参考文献。

+0

谢谢Oren,现在开始有所了解。我也可以开始理解MS为什么说“等待新工具”。也许我应该尝试VS2015.3 RC ...我可能确实希望我的库最终在IoT Core下工作在基于UWP/ARM的目标上,因此我希望使用xproj。 –

+2

如果您的目标是与UWP和ASPNet Core 1.0兼容,并且您只需要一个输出,那么最简单的方法可能是一个'csproj',它的目标'netstandard1.4'。你不需要'xproj'来实现这一点,而项目到项目的引用更容易。 –

+0

哦,事实上,我可以看到2015年更新2中的链接... 2015.3 RC值得在这个阶段安装吗?因为它是一个RC,它应该是相当稳定的... –

相关问题