![](/img/trans.png)
[英]Can I use packages written for .NET Framework in .NET Standard 2.0?
[英]How to set dependencies when I use .NET Standard 2.0 DLL libraries with a .NET Framework console application?
在这种情况下,我无法弄清楚应该如何设置依赖项(在哪里添加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
项目输出中,这就是我收到错误的原因。
如何正确解决这个问题?
这是一个众所周知且很老的伤害记录在GitHub:
依赖关系不会通过项目引用链接从新的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>
新的SDK格式csproj
文件与遗留格式项目文件不能很好地兼容。
但不要担心.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包。
如果除了1.0.0.0版本的Properties\\AssemblyInfo.cs
有任何内容,请在解决方案资源管理器中右键单击该项目,然后单击“包”。 添加所需的详细信息,然后保存:
就是这样,虽然根据您的具体情况,您可能还需要做其他2件事:
如果存在应排除的文件,则需要将其排除,因为默认情况下新项目格式包括所有相关文件类型。
您可能必须设置语言版本。 在我的Visual Studio 2019预览版中, latest
(最新的C#次要版本)是默认设置,因此我不需要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.