Несколько DLL-файлов из ссылочных проектов .NET Standard - PullRequest
6 голосов
/ 12 июня 2019

Я создал три проекта библиотеки .NET Standard C ++ с Visual Studio 2017 и настройками по умолчанию.

Проекты:

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

  • \ Сложение \ MainProject:
    • MainProject.dll
  • \ Построение \ TimeProject
    • MainProject.dll
    • TimeProject.dll
  • \ Построение \ ClockProject
    • MainProject.dll
    • TimeProject.dll
    • ClockProject.dll

Если я изменил свойство Copy Local на false, DLL из проекта, на который есть прямая ссылка, исчезнет. Это лучше, но вложенная ссылочная DLL остается -> MainProject.dll в ClockProject.

Выходные каталоги (Copy Local = false):

  • \ Сложение \ MainProject:
    • MainProject.dll
  • \ Построение \ TimeProject
    • TimeProject.dll
  • \ Построение \ ClockProject
    • MainProject.dll
    • ClockProject.dll

Я хочу не допустить, чтобы ClockProject создавал MainProject.dll в своем выходном каталоге, поскольку MainProject.dll уже существует в выходном каталоге MainProject.

У меня огромный проект, и в этих обстоятельствах у меня в папках проекта много одинаковых 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 ]

5 голосов
/ 17 июня 2019

Я нашел следующее решение:

Для ClockProject требуются MainProject и TimeProject.

Если я ссылаюсь только на TimeProject в ClockProject, то он работает (поскольку TimeProject ссылается на MainProject), но MainProject.dll копируется в выходную папку ClockProject, которая мне не нужна.

Однако, если я ссылаюсь на ОБА проекты в ClockProject, Main- и TimeProject и устанавливаю оба параметра на CopyLocal = false, тогда только ClockProject.dll будет скопирован в выходную папку ClockProject.

2 голосов
/ 13 июня 2019

Для таких проектов я захожу в свойства каждого проекта и устанавливаю каталог Common Output.Таким образом, все проекты сбрасывают свои сборки в один каталог.

Поскольку это невозможно, в ваших ссылках выберите ссылку MainProject.dll, посмотрите на свойства и установите «Копировать локально» на «Ложь».

1 голос
/ 16 июня 2019

Вы разработали его неправильно, и поэтому у вас возникают конфликты версий.

Вам необходимо изменить дизайн решения, чтобы у проекта было дерево зависимостей с правильной иерархией:

Основной проект <- Проект времени <- Проект часов </strong>

Чтобы исправить ваше решение:

  • Удалить все ссылки во всех проектах.
  • Создайте ClockProject самостоятельно (или MainProject, если это непонятный путь).
  • Откройте TimeProject, обратитесь к Clock Project и соберите TimeProject (или из TimeProject, ссылка Main и build).
  • Открыть MainProject и ссылку TimeProject (или из ссылки ClockProject TimeProject).

На каждом этапе вам может потребоваться рефакторинг вещей вокруг. Ссылка Main в каждом проекте - это big no-no . Вы ссылаетесь на небольшие модульные инкапсулированные библиотеки и строите дерево решений для MainProject в решении.

...