我还不太了解.NET,所以我很遗憾我错过了一些明显的东西。
我创建了一个库(目标为dll,为.NET标准2.0设置),将其打包为dll和nuget包。现在我想在ASP.NET Core 2.0上的另一个项目中使用该库。我该怎么办?
我目前在Linux VM上,所以我使用VS Code,因此我更喜欢不使用完整Visual Studio的解决方案。我使用完整的Visual Studio尝试了一些解决方案,但这对我没有用,因为我还没有找到参考资源管理器。
答案 0 :(得分:13)
您必须在csproj文件中引用您的库
空的csproj文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
现在,您可以有两种类型的参考
项目参考 - 您的解决方案中有一个项目作为类库,您想直接引用它
<ProjectReference Include="..\..\src\mylib.csproj" />
套餐参考 - 您有一个指向NuGet套餐的链接
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
在csproj文件中,引用应位于&#34; ItemGroup&#34;阻止,每个引用类型应该拥有它自己的&#34; ItemGroup&#34;
这是一个包含一些包引用和一些项目引用的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>
答案 1 :(得分:13)
很多人推荐两种解决方案中的一种:
1)将库复制到解决方案文件夹中。
cp -r foo/foo ./foo
dotnet sln add foo/foo.csproj
cd bar
dotnet add reference ../foo/foo.csproj
这是一个糟糕的解决方案。
不要这样做(即每次要使用它时复制并粘贴你的库代码,由于显而易见的原因而不好)。
2)设置本地nuget存储库,将库复制到本地存储库,然后添加它。
nuget add -name "Local" -source /home/doug/packages
nuget add ~/foo/foo.nupkg -source /home/doug/packages
然后安装包:
cd bar
dotnet add package foo
这是一个可接受的解决方案,但如果您正在积极处理您的库(foo),则工作流程非常烦人,因为-source
路径必须绝对。
-
我建议您查看dotnet add package with local package file,它解释了如何使用您想要使用的任何自定义nupkg文件的本地缓存。
基本上,只需将其放入解决方案文件夹:
NuGet.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="local" value="./packages" />
</packageSources>
</configuration>
(请注意./packages是相对路径,即使您在完全不同的机器或操作系统上检查项目,它也能正常工作)
现在,如果您致电dotnet add package X
,它还会在您的./packages/
文件夹中查找名为x.nupkg的文件。
现在,如果您想使用任何自定义本地库,您只需要:
cp ~/foo/foo.nupkg ./packages
cd bar
dotnet add package foo
&LT; 3
(注意:默认情况下,nuget将你的.nupkg文件缓存在〜/ .nuget中,如果你调用dotnet add package X
,,即使你有不同的X,也会从该文件夹恢复包。你当地的./packages文件夹中的nupkg。你可能会发现命令dotnet nuget locals all --clear
很有用,如果你遇到奇怪的行为,以确保你得到你想要的nupkg的确切版本,而不是一些任意的缓存版本)
答案 2 :(得分:1)
鉴于您要在新的ASP.NET Core 2.0项目中引用的DLL相对较新,我怀疑您在开发ASP.Net项目时需要对此原始DLL进行更改。
在这种情况下,我会将原始DLL项目添加为ASP.Net解决方案的一部分,以便您可以处理两组源代码,包括在同一解决方案工作区内设置断点。
原始DLL项目的NUGET打包可能会延迟,直到整个组合解决方案的第一个版本稳定下来,并且您希望将该DLL提供给超出ASP.NET应用程序范围的更大的开发人员。
答案 3 :(得分:0)
在.csproj文件中引用本地包的另一种方法:
QStyledItemDelegate::paint()
答案 4 :(得分:0)
一个不错的解决方案是将要使用的库(.dll文件)添加到要使用该库的项目的“项目引用”中:
右键单击项目->添加->参考->项目->浏览-> Path_to_your_generation_library(.dll)
这将在.csproj文件中自动生成以下节点:
<ItemGroup>
<Reference Include="DotNetCoreClassLibraryCodeParser">
<HintPath>..\..\DotNetCoreClassLibrary\DotNetCoreClassLibrary\bin\Debug\netcoreapp2.1\DotNetCoreClassLibrary.dll</HintPath>
</Reference>
</ItemGroup>
希望有帮助。