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

如何在新创建的 .NET Core 2.0 Web 应用程序中定位 .NET Standard 2.0?

为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?