Ошибки при загрузке слабо связанных пользовательских сборок

#c# #.net #api #assembly

#c# #.net #API #.net-сборка

Вопрос:

Доброе утро.

Я разрабатываю веб-API с использованием Net 6.

Предварительная структура API показана на рисунке.

введите описание изображения здесь

ContractGpdApi — это прямая сборка API. В нем есть ссылка на сборку ContractGpdApi.ServiceInterfaces. ContractGpdApi.ServiceInterfaces — это сборка, содержащая классы DTO (бизнес-модели) и интерфейсы служб. ContractGpdApi.ServiceImplementations — эта сборка содержит классы, реализующие интерфейсы сборки ContractGpdApi.ServiceInterfaces. Сборка адаптирует методы и классы сборки ContractGpdApi.DbServiceInterfaces в методы и классы сборки ContractGpdApi.ServiceInterfaces. Контракт Gp-dapi.DbServiceInterfaces — эта сборка содержит классы и интерфейсы уровня доступа к базе данных. ContractGpdApi.DbServiceImplementations — эта сборка содержит классы, реализующие интерфейсы сборки ContractGpdApi.DbServiceInterfaces. Сборка содержит ссылку на сборку ContractGpdApi.DbServiceInterfaces, а также ссылки на сборки microsoft.entityframeworkcore, microsoft.entityframeworkcore.sqlserver

В итоге я реализовал лестничный шаблон и разделил CUI на слабо связанные слои.

Уровень базы данных представлен двумя сборками: ContractGpdApi.DbServiceImplementations и ContractGpdApi.DbServiceInterfaces.

Рабочий уровень бизнеса представлен двумя сборками: ContractGpdApi.ServiceImplementations и ContractGpdApi.ServiceInterfaces.

Соответственно, assembly ContractGpdApi будет своего рода корневым каталогом, в который вы загружаете и внедряете зависимости, слабо связанные сборки.

При загрузке сборок возникают следующие ошибки:

  1. Не удалось загрузить файл или сборку «ContractGpdApi.DbServiceInterfaces, Версия=1.0.0.0, Культура=нейтральная, PublicKeyToken=null». Указанный файл не может быть найден.
  2. Не удалось загрузить файл или сборку » Microsoft.EntityFrameworkCore, Версия=6.0.0.0, Культура=нейтральная, PublicKeyToken=adb9793829ddae60′. Указанный файл не может быть найден.

введите описание изображения здесь

Все остальные сборки загружаются нормально. Содержимое файла ContractGpdApi.csproj:

 lt;Project Sdk="Microsoft.NET.Sdk.Web"gt;   lt;PropertyGroupgt;  lt;TargetFrameworkgt;net6.0lt;/TargetFrameworkgt;  lt;/PropertyGroupgt;   lt;ItemGroupgt;  lt;PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /gt;  lt;/ItemGroupgt;   lt;ItemGroupgt;  lt;ProjectReference Include="..ContractGpdApi.ServiceInterfacesContractGpdApi.ServiceInterfaces.csproj" /gt;  lt;/ItemGroupgt;   lt;Target Name="PostBuild" AfterTargets="PostBuildEvent"gt;  lt;Exec Command="call F:CopyingAssemblies.bat" /gt;  lt;/Targetgt;  lt;/Projectgt; 

Содержимое файла CopyingAssemblies.bat:

 xcopy /y "C:GitContractGpdApiContractGpdApi.DbServiceImplementationsbinDebugnet6.0*.dll" "C:GitContractGpdApiContractGpdApibinDebugnet6.0" xcopy /y "C:GitContractGpdApiContractGpdApi.ServiceImplementationsbinDebugnet6.0*.dll" "C:GitContractGpdApiContractGpdApibinDebugnet6.0"  

Скажи мне, что я делаю не так?

Комментарии:

1. Возможно, вы захотите использовать .net-assembly тег вместо assembly . Обязательно прочитайте описание assembly тега.

Ответ №1:

Внесено изменение в код метода:

 private static Assembly LoadAssembly(string assemblyName, bool skipOnError)  {  try  {  return Assembly.LoadFrom(assemblyName); //Old code: Assembly.LoadFile(assemblyName);  }  catch (Exception e)  {  if (!(skipOnError amp;amp; (e is FileNotFoundException || e is FileLoadException || e is BadImageFormatException)))  {  throw;  }   return null;  }  }  

Это редактирование исправило только первую ошибку:

Не удалось загрузить файл или сборку «ContractGpdApi.DbServiceInterfaces, Версия=1.0.0.0, Культура=нейтральная, PublicKeyToken=null». Указанный файл не может быть найден.