繁体   English   中英

当我将.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?

在这种情况下,我无法弄清楚应该如何设置依赖项(在哪里添加EntityFramework nuget包):

  1. Core.Persistence项目,编译为.NET Standard 2.0 DLL库。 我有实体框架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项目,我不想专注于这个问题。

所以,这就是我所做的:

问题是,当我尝试从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格式!

确保您的工作已致力于源代码管理,或制作该文件夹的副本,然后执行以下操作:

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

  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. 如果除了1.0.0.0版本的Properties\\AssemblyInfo.cs有任何内容,请在解决方案资源管理器中右键单击该项目,然后单击“包”。 添加所需的详细信息,然后保存:

在此输入图像描述

就是这样,虽然根据您的具体情况,您可能还需要做其他2件事:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM