Можно ли ссылаться на проект, который существует в решении, и использовать ссылку на пакет NuGet как запасной вариант, если не в .NET Core? - PullRequest
2 голосов
/ 22 июня 2019

У меня есть проект .NET Standard, в котором я реализовал модуль для платформы ASP.NET Core CMS. В настоящее время он использует библиотеки инфраструктуры CMS, поступающие из пакетов NuGet. Если я возьму исходный код платформы CMS из GitHub и добавлю свой модуль в его решение и заменим ссылки на пакеты на фактические ссылки на проект, он будет работать нормально.

Моя цель - заставить его работать без обновления ссылок в файле csproj, поэтому, если проект добавлен в решение с полным исходным кодом, используйте ссылки проекта, в противном случае используйте ссылки на пакеты NuGet.

Итак, скажем, проект .NET Standard называется «ModuleA». Он имеет ссылку на пакет ModuleB:

<ItemGroup>
  <PackageReference Include="ModuleB" Version="1.0.0" />
</ItemGroup>

Когда я хочу использовать ModuleA в решении, где доступен ModuleB, я использую ссылку на проект:

<ItemGroup>
  <ProjectReference Include="..\..\ModuleB\ModuleB.csproj" />
</ItemGroup>

Я бы хотел как-то включить их обоих в файл .csproj и сделать так, чтобы он использовал правильные ссылки при сборке (например, на основании некоторых условий, таких как проект существует?).

Если оба будут добавлены в csproj, сборка завершится неудачно (например, «Невозможно найти проект ... ModuleB.csproj. Проверьте, что ссылка на проект действительна и этот файл проекта существует.»).

Ответы [ 2 ]

3 голосов
/ 22 июня 2019

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

Я бы порекомендовал добавить конфигурацию, например, в моем примере "Local-Debug" и условия использования в вашем csproj.

Пример

Создание конфигурации:

enter image description here

enter image description here

И в вашем csproj вы можете сделать это:

<ItemGroup>
  <ProjectReference Condition="'$(Configuration)' == 'Local-Debug'" Include="otherProject.csproj" />
  <PackageReference Condition="'$(Configuration)' != 'Local-Debug'" Include="otherProjectPackage" Version="2.4.1" />
</ItemGroup>
0 голосов
/ 22 июня 2019

Ваши зависимости должны быть статически известны и разрешены во время сборки.См. Ответ @ Джулиана для хорошего решения на основе конфигурации во время сборки.

Как решение во время выполнения: вы можете динамически загружать ваши ссылки во время выполнения.Таким образом, вы можете найти нужную вам DLL в рабочем каталоге вашего приложения и, если вы не найдете ее там, загрузить ее (из Nuget или из другого места), либо в виде двоичного файла, который вы можете загрузить напрямую, либо какисточник, который вы можете построить;и затем динамически загружать эту библиотеку.

Вот как можно динамически загружать сборку (во время выполнения): https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.loadfrom?view=netframework-4.8

И этот вопрос: Динамически загружать библиотеку

Кодирование динамически загружаемой сборки имеет свои особенности;вам понадобятся четкие определения интерфейса для указанной библиотеки, иначе вы столкнетесь с большим количеством reflection и dynamic s.

...