【问题标题】:Multiple DLLs from referenced .NET Standard projects来自引用的 .NET Standard 项目的多个 DLL
【发布时间】:2019-10-27 10:30:39
【问题描述】:

我使用 Visual Studio 2017 和默认设置创建了三个 .NET Standard 类库 C# 项目。

项目:

  • 主项目
  • 时间计划
    • 依赖项-> MainProject
  • 时钟项目
    • 依赖关系 -> TimeProject

他们每个人都必须有自己的输出目录,如:

<OutputPath>C:\Projects\DataControl\Build\MainProject</OutputPath>
<OutputPath>C:\Projects\DataControl\Build\TimeProject</OutputPath> 
<OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>

项目 DLL 文件放置在输出目录中,但问题是引用的项目 DLL 也放置在输出目录中(TimeProject.dll 和 MainProject.dll)

输出目录(复制本地 = true):

  • \构建\主项目:
    • MainProject.dll
  • \Build\TimeProject
    • MainProject.dll
    • TimeProject.dll
  • \构建\时钟项目
    • MainProject.dll
    • TimeProject.dll
    • ClockProject.dll

如果我将属性 Copy Local 更改为 false,则直接引用项目中的 DLL 将消失。这样更好,但嵌套引用的 DLL 仍然存在 -> ClockProject 中的 MainProject.dll。

输出目录(复制本地 = false):

  • \构建\主项目:
    • MainProject.dll
  • \Build\TimeProject
    • TimeProject.dll
  • \构建\时钟项目
    • MainProject.dll
    • ClockProject.dll

我想防止 ClockProject 在其输出目录中创建 MainProject.dll,因为 MainProject.dll 已存在于 MainProject 的输出目录中。

我有一个庞大的项目,在这种情况下,我的项目文件夹中有很多相同的 DLL。然而,在我的程序启动期间,一个逻辑也会在子文件夹中搜索 DLL,然后找到同一个项目的多个 DLL,这会导致版本冲突。一般来说,我想保留这个逻辑,所以我正在寻找一个只会生成项目 DLL,而不是引用的解决方案。

最后,我的 csproj 文件。其他两个项目文件看起来相似。

ClockProject.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\TimeProject\TimeProject.csproj">
      <Private>false</Private>
    </ProjectReference>
  </ItemGroup>

</Project>

【问题讨论】:

  • 等等... MainProject 依赖于 TimeProject,而 TimeProject 依赖于 MainProject... 你是不是打错字了?如果不是......那是一个棘手的构建
  • 就像 Marc 所说,通常,项目不能相互依赖,因为构建一个需要构建另一个,但是在构建第一个之前,您不能构建另一个......一个讨厌的问题。
  • @MarcGravell 抱歉,这是个错误。 MainProject 没有依赖项
  • “我的问题”到底是什么?在 Visual Studio 中调试时,您将需要 ClockProject 文件夹中的所有依赖项。在构建服务器上,将不需要的 DLL 作为工件复制时排除它们是相当简单的。您要解决的方案是什么?
  • @NightOwl888 但是属性“复制本地=假”实际上阻止了将依赖项复制到输出文件夹中。这也适用于直接引用的 DLL,但不适用于嵌套的 DLL。

标签: c# .net visual-studio build .net-standard-2.0


【解决方案1】:

我找到了以下解决方案:

ClockProject 需要 MainProject 和 TimeProject。

如果我只引用 ClockProject 中的 TimeProject,那么它可以工作(因为 TimeProject 引用 MainProject),但 MainProject.dll 被复制到 ClockProject 输出文件夹,这是我不想要的。

但是,如果我在 ClockProject、Main- 和 TimeProject 中引用这两个项目并将两者都设置为 CopyLocal = false,那么只有 ClockProject.dll 将被复制到 ClockProject 的输出文件夹中。

【讨论】:

    【解决方案2】:

    对于这样的项目,我会转到每个项目属性并设置一个通用输出目录。这样,所有项目都将其构建转储到一个目录中。

    因为这是不可能的,所以在您的参考中选择 MainProject.dll 参考,查看属性并将 Copy Local 设置为 False。

    【讨论】:

    • 我需要为每个项目创建一个单独的文件夹,并且我的问题中的循环引用错误已被编辑
    【解决方案3】:

    您的设计方式错误,这就是您遇到版本冲突的原因。

    您需要重新设计解决方案,以便项目有一个具有正确层次结构的依赖关系树:

    主项目

    修复您的解决方案:

    • 删除所有项目中的所有引用。
    • 自行构建 ClockProject(或 MainProject,如果您想这样做会令人困惑)。
    • 打开 TimeProject,参考 Clock Project 并构建 TimeProject(或从 TimeProject ref Main 和 build)。
    • 打开 MainProject 并参考 TimeProject(或从 ClockProject 参考 TimeProject)。

    在每个步骤中,您可能都需要重构周围的东西。从每个项目中引用 Main 是一个大忌。您引用小型、模块化、封装的库并为解决方案中的 MainProject 构建依赖关系树。

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多