引用的.NET Standard项目中的多个DLL

时间:2019-06-12 20:49:03

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

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

项目:

  • MainProject
  • TimeProject
    • 依赖关系-> MainProject
  • ClockProject
    • 依赖关系-> 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)

输出目录(Copy Local = true):

  • \ Build \ MainProject:
    • MainProject.dll
  • \ Build \ TimeProject
    • MainProject.dll
    • TimeProject.dll
  • \ Build \ ClockProject
    • MainProject.dll
    • TimeProject.dll
    • ClockProject.dll

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

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

  • \ Build \ MainProject:
    • MainProject.dll
  • \ Build \ TimeProject
    • TimeProject.dll
  • \ Build \ ClockProject
    • MainProject.dll
    • ClockProject.dll

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

我有一个很大的项目,在这种情况下,我的项目文件夹中有很多相同的DLL。但是,在我的程序启动期间,逻辑还会在子文件夹中搜索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>

3 个答案:

答案 0 :(得分:5)

我找到了以下解决方案:

ClockProject需要MainProject和TimeProject。

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

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

答案 1 :(得分:2)

对于这样的项目,我进入每个项目属性并设置一个Common Output目录。这样,所有项目都将其构建文件转储到一个目录中。

由于这是不可能的,因此在您的引用中选择MainProject.dll引用,查看属性并将“将本地复制”设置为False。

答案 2 :(得分:1)

您设计的方式错误,这就是为什么版本冲突的原因。

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

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

要解决您的解决方案,请执行以下操作:

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

在每个步骤中,您可能都需要重构。每个项目都引用Main是一个不行。您可以引用小型的模块化封装库,并在解决方案中为MainProject建立依赖关系树。