来自引用的 .NET Standard 项目的多个 DLL

Multiple DLLs from referenced .NET Standard projects

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

项目:

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

<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)

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

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

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

我想防止 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>

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

因为那是不可能的,在你的参考 select MainProject.dll 参考中,查看属性并将复制本地设置为 False。

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

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

主项目<-时间项目<-时钟项目

修复您的解决方案:

  • 删除所有项目中的所有引用。
  • 自己构建 ClockProject(或者 MainProject,如果这是你想要走的令人困惑的方式)。
  • 打开 TimeProject,引用 Clock Project 并构建 TimeProject(或从 TimeProject 引用 Main 并构建)。
  • 打开 MainProject 并引用 TimeProject(或从 ClockProject 引用 TimeProject)。

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

我找到了以下解决方案:

ClockProject 需要 MainProject 和 TimeProject。

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

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