如何在 .NET Core 2.0 中包含库
How to include a library in .NET Core 2.0
我对 .NET 还不是很了解,所以我想我遗漏了一些明显的东西。
我创建了一个库(目标为 DLL 文件,设置为 .NET 标准 2.0),将其打包为 DLL 文件和 NuGet 包。现在我想在 ASP.NET Core 2.0 的另一个项目中使用该库。我应该怎么做?
我目前在 Linux VM 上,所以我使用 Visual Studio 代码,因此我更喜欢一些不使用完整 Visual Studio 的解决方案。我尝试了一些使用完整 Visual Studio 的解决方案,但这对我不起作用,因为我没有在任何地方找到参考资源管理器。
您必须在 .csproj 文件中引用您的库:
空的 .csproj 文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
现在,您可以有两种类型的引用:
项目参考 - 您有一个项目作为解决方案中的 class 库,您希望直接引用它:
<ProjectReference Include="..\..\src\mylib.csproj" />
包参考 - 您有一个 link 到 NuGet 包:
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
在您的 .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>
鉴于您要在新的ASP.NET Core 2.0项目中引用的DLL文件比较新鲜,我怀疑您在开发ASP.NET 项目。
在这种情况下,我会将原始 DLL 项目添加为 ASP.NET 解决方案的一部分,这样您就可以处理两组源代码,包括在同一解决方案工作区内设置断点。
原始 DLL 项目的 NuGet 打包可以延迟到整个组合解决方案的第一个版本稳定下来,并且您希望该 DLL 文件可供 ASP.NET 范围之外的更多开发人员使用申请。
很多人推荐以下两种解决方案之一:
将库复制到您的解决方案文件夹中。
cp -r foo/foo ./foo
dotnet sln 添加 foo/foo.csproj
CD条
dotnet 添加引用 ../foo/foo.csproj
这是一个糟糕的解决方案。
不要这样做(即,每次要使用库代码时都复制并粘贴它。出于显而易见的原因,这是不好的)。
设置本地 NuGet 存储库,将您的库复制到本地存储库,然后添加它。
nuget add -name "Local" -source /home/doug/packages
nuget 添加 ~/foo/foo.nupkg -source /home/doug/packages
然后安装包:
cd bar
dotnet add package foo
这是一个可以接受的解决方案,但如果您正在积极处理您的库 (foo),那么工作流程会非常烦人,因为 -source
路径必须是 absolute .
--
我建议您查看 ,其中解释了如何在本地缓存您要使用的任何自定义 .nupkg 文件。
基本上,只需将其放入您的解决方案文件夹即可:
文件NuGet.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="local" value="./packages" />
</packageSources>
</configuration>
(请注意 ./packages 是一个 relative 路径,即使您在完全不同的项目上检出项目时它也能正常工作机器或 OS.)
现在,如果您调用 dotnet add package X
,它还会在您的 ./packages/
文件夹中查找任何名为 x.nupkg 的文件。
现在如果你想使用任何自定义的本地库,你需要做的就是:
cp ~/foo/foo.nupkg ./packages
cd bar
dotnet add package foo
(注意:默认情况下,NuGet 会将您的 .nupkg 文件缓存在 ~/.nuget 中,如果您调用 dotnet add package X
、即使 你在本地 ./packages 文件夹中有一个不同的 X.nupkg。如果遇到以下情况,你可能会发现命令 dotnet nuget locals all --clear
很有用奇怪的行为确保你得到你想要的 .nupkg 文件的确切版本,而不是一些任意的缓存版本)
在.csproj文件中引用本地包的另一种方式:
<ItemGroup>
<Reference Include="MyAssembly">
<HintPath>path\to\MyAssembly.dll</HintPath>
</Reference>
</ItemGroup>
一个好的解决方案是将您要使用的库(.dll 文件)添加到您要在其中使用该库的项目的项目引用中:
右键单击项目 → 添加 → 参考 → 项目 → 浏览 → Path_to_your_generated_library (.dll)
这将在 .csproj 文件中自动生成以下节点:
<ItemGroup>
<Reference Include="DotNetCoreClassLibraryCodeParser">
<HintPath>..\..\DotNetCoreClassLibrary\DotNetCoreClassLibrary\bin\Debug\netcoreapp2.1\DotNetCoreClassLibrary.dll</HintPath>
</Reference>
</ItemGroup>
我对 .NET 还不是很了解,所以我想我遗漏了一些明显的东西。
我创建了一个库(目标为 DLL 文件,设置为 .NET 标准 2.0),将其打包为 DLL 文件和 NuGet 包。现在我想在 ASP.NET Core 2.0 的另一个项目中使用该库。我应该怎么做?
我目前在 Linux VM 上,所以我使用 Visual Studio 代码,因此我更喜欢一些不使用完整 Visual Studio 的解决方案。我尝试了一些使用完整 Visual Studio 的解决方案,但这对我不起作用,因为我没有在任何地方找到参考资源管理器。
您必须在 .csproj 文件中引用您的库:
空的 .csproj 文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
现在,您可以有两种类型的引用:
项目参考 - 您有一个项目作为解决方案中的 class 库,您希望直接引用它:
<ProjectReference Include="..\..\src\mylib.csproj" />
包参考 - 您有一个 link 到 NuGet 包:
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
在您的 .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>
鉴于您要在新的ASP.NET Core 2.0项目中引用的DLL文件比较新鲜,我怀疑您在开发ASP.NET 项目。
在这种情况下,我会将原始 DLL 项目添加为 ASP.NET 解决方案的一部分,这样您就可以处理两组源代码,包括在同一解决方案工作区内设置断点。
原始 DLL 项目的 NuGet 打包可以延迟到整个组合解决方案的第一个版本稳定下来,并且您希望该 DLL 文件可供 ASP.NET 范围之外的更多开发人员使用申请。
很多人推荐以下两种解决方案之一:
将库复制到您的解决方案文件夹中。
cp -r foo/foo ./foo dotnet sln 添加 foo/foo.csproj CD条 dotnet 添加引用 ../foo/foo.csproj
这是一个糟糕的解决方案。
不要这样做(即,每次要使用库代码时都复制并粘贴它。出于显而易见的原因,这是不好的)。
设置本地 NuGet 存储库,将您的库复制到本地存储库,然后添加它。
nuget add -name "Local" -source /home/doug/packages nuget 添加 ~/foo/foo.nupkg -source /home/doug/packages
然后安装包:
cd bar
dotnet add package foo
这是一个可以接受的解决方案,但如果您正在积极处理您的库 (foo),那么工作流程会非常烦人,因为 -source
路径必须是 absolute .
--
我建议您查看
基本上,只需将其放入您的解决方案文件夹即可:
文件NuGet.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="local" value="./packages" />
</packageSources>
</configuration>
(请注意 ./packages 是一个 relative 路径,即使您在完全不同的项目上检出项目时它也能正常工作机器或 OS.)
现在,如果您调用 dotnet add package X
,它还会在您的 ./packages/
文件夹中查找任何名为 x.nupkg 的文件。
现在如果你想使用任何自定义的本地库,你需要做的就是:
cp ~/foo/foo.nupkg ./packages
cd bar
dotnet add package foo
(注意:默认情况下,NuGet 会将您的 .nupkg 文件缓存在 ~/.nuget 中,如果您调用 dotnet add package X
、即使 你在本地 ./packages 文件夹中有一个不同的 X.nupkg。如果遇到以下情况,你可能会发现命令 dotnet nuget locals all --clear
很有用奇怪的行为确保你得到你想要的 .nupkg 文件的确切版本,而不是一些任意的缓存版本)
在.csproj文件中引用本地包的另一种方式:
<ItemGroup>
<Reference Include="MyAssembly">
<HintPath>path\to\MyAssembly.dll</HintPath>
</Reference>
</ItemGroup>
一个好的解决方案是将您要使用的库(.dll 文件)添加到您要在其中使用该库的项目的项目引用中:
右键单击项目 → 添加 → 参考 → 项目 → 浏览 → Path_to_your_generated_library (.dll)
这将在 .csproj 文件中自动生成以下节点:
<ItemGroup>
<Reference Include="DotNetCoreClassLibraryCodeParser">
<HintPath>..\..\DotNetCoreClassLibrary\DotNetCoreClassLibrary\bin\Debug\netcoreapp2.1\DotNetCoreClassLibrary.dll</HintPath>
</Reference>
</ItemGroup>