在.NET Framework控制台应用程序中使用.NET Standard 2.0 DLL库时,如何设置依赖项?

时间:2019-07-12 11:45:28

标签: c# .net visual-studio nuget .net-standard

在这种情况下,我不知道应该如何设置依赖项(在何处添加EntityFramework nuget包):

  1. Core.Persistence项目,可编译为.NET Standard 2.0 DLL库。我有Entity Framework 6,用于EF,DbContext等的数据库实体类。它应该仅取决于EntityFrameworkCore

  2. Core.Domain项目,该项目也可以编译为.NET Standard 2.0 DLL库。我想将我的业务对象POCO类放在这里。应该没有依赖性。

  3. Core.Application项目,这是.NET Standard 2.0 DLL库。我这里有所有应用程序逻辑。它取决于Core.Persistence,因为它进行数据库查询,而取决于Core.Domain,因为它从查询结果中产生业务对象。

  4. Client.ConsoleClient项目。它使.NET Framework 4.7.2可执行。应该只依靠Core.Application但我在这里遇到问题

  5. Client.WindowsClient项目,我不想关注这个问题。

所以,这就是我所做的:

问题是,当我尝试从System.IO.FileLoadException调用方法时,我得到了Core.Application

它表示找不到System.Interactive.Async文件(它是对EntityFrameworkCore的依赖)。在将此文件添加为依赖项之后,还有其他System.IO.FileLoadException错误。

因此,我暂时将EF6 Core NuGet软件包添加到了Client.ConsoleClient中,而System.IO.FileLoadException的问题已经消失了,但是我觉得我做错了。

这时我发现,Visual Studio并未将DLL文件从Core.xxx项目输出复制到Client.ConsoleClient项目输出,这就是为什么我会出错。


如何正确解决此问题?

2 个答案:

答案 0 :(得分:4)

这是一个众所周知且相当古老的伤害,登录到GitHub:
依赖项不会通过项目引用link

从新的NET Standard项目流到旧的桌面项目

一种可行的解决方案是像您一样将NuGet依赖项添加到Full NET Framework项目中。

将以下内容包含在.csproj的{​​{1}}项目文件中的另一种建议对我也有用。

Full NET Framework project

请注意,我在<PropertyGroup> <RestoreProjectStyle>PackageReference</RestoreProjectStyle> </PropertyGroup> 项目中使用了程序包引用。

就目前而言,看来NET Standard项目最好以NET Standard包的形式使用,因为它们会将任何依赖引用作为NuGet包包含到目标项目中


Core.Persistence.csproj 引用NuGet

Entity Framework

Core.Application.csproj 引用<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" /> </ItemGroup> </Project>

Core.Persistence

ConsoleClient.csproj 引用了<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\Core.Persistence\Core.Persistence.csproj" /> </ItemGroup> </Project>

Core.Application

答案 1 :(得分:2)

具有旧格式项目文件的新SDK格式csproj文件don't play terribly well

但是请不要担心,因为.NET Framework控制台应用程序可以使用SDK格式!

确保您已将工作委托给源代码管理,或制作了该文件夹的副本,然后执行以下操作:

  1. Properties\AssemblyInfo.cs中删除Client.ConsoleClient。我们将不再需要此文件,因为该文件的内容现在已进入项目文件。

  2. 删除packages.config-同样,Nuget引用将存储在项目文件中-也就是说,在我们稍后引用Core.Application之后是否需要任何Nuget引用。

  3. 在文本编辑器中打开Client.ConsoleClient.csproj并将内容更改为:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net472</TargetFramework>
      </PropertyGroup>
    </Project>
    
  4. 在Visual Studio中重新加载项目。

  5. 添加对Core.Application的引用,并添加所需的任何Nuget软件包。

  6. 如果Properties\AssemblyInfo.cs中除版本1.0.0.0以外的任何内容,请在解决方案资源管理器中右键单击该项目,然后单击“打包”。添加所需的详细信息,然后保存:

enter image description here

就是这样,尽管您可能根据您的具体情况还需要做两件事:

  • 如果有应排除的文件,则需要将其排除,因为新的项目格式默认包括所有相关文件类型。

  • 您可能必须设置语言版本。在我的Visual Studio 2019预览版中,latest(C#的最新次要版本)是默认设置,因此我不需要这样做。