当我将 .NET Standard 2.0 DLL 库与 .NET Framework 控制台应用程序一起使用时,如何设置依赖项?
Posted
技术标签:
【中文标题】当我将 .NET Standard 2.0 DLL 库与 .NET Framework 控制台应用程序一起使用时,如何设置依赖项?【英文标题】:How to set dependencies when I use .NET Standard 2.0 DLL libraries with a .NET Framework console application? 【发布时间】:2019-11-22 04:27:19 【问题描述】:我不知道在这种情况下我应该如何设置依赖项(在哪里添加 EntityFramework nuget 包):
Core.Persistence
编译为 .NET Standard 2.0 DLL 库的项目。我有实体框架 6、EF 的数据库实体类、DbContext 等。它应该只依赖于EntityFrameworkCore
。
Core.Domain
项目,它也编译为 .NET Standard 2.0 DLL 库。我想把我的业务对象 POCO 类放在这里。这应该没有依赖关系。
Core.Application
项目,这是 .NET Standard 2.0 DLL 库。我这里有所有的应用程序逻辑。它依赖于Core.Persistence
,因为它进行数据库查询和Core.Domain
,因为它从查询结果中生成业务对象。
Client.ConsoleClient
项目。它使 .NET Framework 4.7.2 可执行。它应该只依赖于Core.Application
,但我这里有问题。
Client.WindowsClient
项目,我不想关注这个问题。
所以,这就是我所做的:
问题是,当我尝试从 Core.Application
调用方法时,我得到了 System.IO.FileLoadException
。
它说它找不到System.Interactive.Async
文件(这是EntityFrameworkCore
的依赖项)。在我将此文件添加为依赖项后 - 还有其他 System.IO.FileLoadException
错误。
所以,我暂时将 EF6 Core NuGet 包添加到我的Client.ConsoleClient
,System.IO.FileLoadException
的问题已经消失,但我觉得我做错了什么。
此时我发现,Visual Studio 没有将 DLL 文件从 Core.xxx
项目输出复制到 Client.ConsoleClient
项目输出,这就是我遇到错误的原因。
如何正确解决这个问题?
【问题讨论】:
【参考方案1】:这是一个众所周知且相当古老的伤害记录在 GitHub 上:
依赖项不会通过项目引用 link 从新的 NET Standard
项目流向旧的桌面项目
一种可能的解决方案是像您一样将NuGet
依赖项添加到Full NET Framework
项目中。
在Full NET Framework project
的.csproj
项目文件中包含以下内容的其他建议也适用于我。
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
请注意,我在 NET Standard
项目中使用包引用。
目前看来,NET Standard
项目最好作为 NuGet
包使用,因为它们会将任何依赖引用作为 NuGet
包包含到目标项目中。
Core.Persistence.csproj 引用 Entity Framework
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
</ItemGroup>
</Project>
Core.Application.csproj 引用Core.Persistence
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Core.Persistence\Core.Persistence.csproj" />
</ItemGroup>
</Project>
ConsoleClient.csproj 引用 Core.Application
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<!-- ... -->
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<!-- ... --->
<ItemGroup>
<ProjectReference Include="..\Core.Application\Core.Application.csproj">
<Project>067b3201-3f65-4654-a0fb-e8fae521bf29</Project>
<Name>Core.Application</Name>
</ProjectReference>
</ItemGroup>
</Project>
【讨论】:
【参考方案2】:新的 SDK 格式 csproj
文件 don't play terribly well 与旧格式项目文件。
但不要担心,因为 .NET Framework 控制台应用程序可以使用 SDK 格式!
确保您的工作已提交到源代码管理,或制作文件夹的副本,然后执行以下操作:
从Client.ConsoleClient
中删除Properties\AssemblyInfo.cs
。我们将不再需要它,因为该文件的内容现在进入了项目文件。
删除packages.config
- 同样,Nuget 引用将存储在项目文件中 - 如果您在我们稍后引用 Core.Application
后需要任何 Nuget 引用。
在文本编辑器中打开 Client.ConsoleClient.csproj
并将内容更改为:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
</Project>
在 Visual Studio 中重新加载项目。
添加对Core.Application
的引用并添加您需要的任何 Nuget 包。
如果您在 Properties\AssemblyInfo.cs
中有任何内容,而不是 1.0.0.0 版本,请右键单击解决方案资源管理器中的项目,然后单击打包。添加您需要的详细信息,然后保存:
就是这样,尽管根据您的情况,您可能还需要做 2 件事:
如果有应该排除的文件,您需要排除它们,因为新的项目格式默认包含所有相关的文件类型。
您可能需要设置语言版本。在我的 Visual Studio 2019 Preview 中,latest
(C# 的最新次要版本)是默认设置,所以我不需要这样做。
【讨论】:
以上是关于当我将 .NET Standard 2.0 DLL 库与 .NET Framework 控制台应用程序一起使用时,如何设置依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
.Net Framework dll 不适用于 .Net Standard 项目
无法在面向 .Net Standard 2.0 的项目中加载 Revit API
如何创建面向 .NET 2.0 和 .NET Standard 的库?
将 .NET Core 2.0 类库转换为 .NET Standard