如何在.NET Core 2.0中包含库

MrM*_*Mid 12 .net c# .net-core asp.net-core-2.0 .net-core-2.0

我还不太了解.NET,所以我很遗憾我错过了一些明显的东西.

我创建了一个库(目标为dll,设置为.NET标准2.0),将其打包为dll和nuget包.现在我想在ASP.NET Core 2.0上的另一个项目中使用该库.我该怎么办?

我目前在Linux VM上,所以我使用VS Code,因此我更喜欢不使用完整Visual Studio的解决方案.我使用完整的Visual Studio尝试了一些解决方案,但这对我不起作用,因为我没有找到参考资源管理器.

are*_*ler 14

您必须在csproj文件中引用您的库

在此输入图像描述

一个空的csproj文件看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

现在,您可以有两种类型的引用

项目参考 - 您有一个项目在您的解决方案中充当类库,并且您希望直接引用它

<ProjectReference Include="..\..\src\mylib.csproj" />
Run Code Online (Sandbox Code Playgroud)

包参考 - 您有一个NuGet包的链接

<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
Run Code Online (Sandbox Code Playgroud)

在你的csproj文件中,引用应该在"ItemGroup"块中,每个引用类型应该有它自己的"ItemGroup"

这是一个csproj文件的示例,其中包含一些包引用和一些项目引用

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.1.0" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" />
    <PackageReference Include="xunit" Version="2.2.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\src\mylib.csproj" />
    <ProjectReference Include="..\..\src\mylib2.csproj" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)


Dou*_*oug 13

很多人推荐两种解决方案之一:

1)将库复制到解决方案文件夹中.

cp -r foo/foo ./foo
dotnet sln add foo/foo.csproj
cd bar
dotnet add reference ../foo/foo.csproj
Run Code Online (Sandbox Code Playgroud)

这是一个可怕的解决方案.

不要这样做(即每次要使用它时复制并粘贴库代码,由于显而易见的原因而不好).

2)设置本地nuget存储库,将库复制到本地存储库,然后添加它.

nuget add -name "Local" -source /home/doug/packages
nuget add ~/foo/foo.nupkg -source /home/doug/packages
Run Code Online (Sandbox Code Playgroud)

然后安装包:

cd bar
dotnet add package foo
Run Code Online (Sandbox Code Playgroud)

这是一个可接受的解决方案,但如果您正在积极处理库(foo),则工作流程非常烦人,因为-source路径必须是绝对的.

-

我建议你看一下dotnet add package和本地包文件,它解释了你如何拥有你想要使用的任何自定义nupkg文件的本地缓存.

基本上,只需将其放入解决方案文件夹:

NuGet.Config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
    <add key="local" value="./packages" />
 </packageSources>
</configuration>
Run Code Online (Sandbox Code Playgroud)

(注意./packages是一个相对路径,即使你在完全不同的机器或操作系统上检查你的项目,它也会工作)

现在,如果你打电话,dotnet add package X它也会在你的./packages/文件夹中查找名为x.nupkg的文件.

现在,如果您想使用任何自定义本地库,您需要做的就是:

cp ~/foo/foo.nupkg ./packages
cd bar
dotnet add package foo
Run Code Online (Sandbox Code Playgroud)

<3

(注意:默认情况下,nuget会将你的.nupkg文件缓存在〜/ .nuget中,如果你调用dotnet add package X,它将从该文件夹中恢复包,即使你的本地./packages文件夹中有不同的X.nupkg.你可能会发现这个命令dotnet nuget locals all --clear很有用如果你遇到奇怪的行为,以确保你得到你想要的nupkg的确切版本,而不是一些任意的缓存版本)