Не удалось загрузить файл или сборку ‘Newtonsoft.Json, версия = 12.0.0.0 при запуске в контейнере dotnet core container

#c# #docker #asp.net-core #json.net #nuget

#c# #docker #asp.net-core #json.net #nuget

Вопрос:

На macOS. Похоже, эта проблема вызвана Google.Облако.Storage.V1.

Это мой csproj:

 <Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>devopsapp_gke</RootNamespace>
    <!-- Add these BindingRedirects settings makes no difference -->
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Cloud.Storage.V1" Version="3.3.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.1" />
    <PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.6.1" />
  </ItemGroup>
</Project>
  

Код просто делает это:

 var storage = StorageClient.Create();
foreach (var bucketobj in storage.ListObjects("mybucket", "")) { }
  

Заглядывая внутрь myapp.deps.json , я вижу ЕДИНСТВЕННУЮ версию Newtonsoft.Json в любой зависимости равен 12.0.3

Локально я могу работать dotnet run -p ./myapp/myapp.csproj без проблем. Запускал dotnet nuget locals all --clear и запускал снова, и он все еще работает.

Я пытаюсь запустить это в контейнере Docker и получаю:

 Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
   at Google.Apis.Json.NewtonsoftJsonSerializer..ctor()
   at Google.Apis.Json.NewtonsoftJsonSerializer..cctor()
  

Вытащил Dockerfile прямо из официальных документов:

 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

COPY . ./

RUN dotnet nuget add source "https://myrepo" --name mysource --username "myuser" -p "mypass" --store-password-in-clear-text
RUN dotnet restore

RUN dotnet publish -c Release -o out --no-restore

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "myapp.dll"]
  

Запустив контейнер, я получаю следующее:

 Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
   at Google.Apis.Json.NewtonsoftJsonSerializer..ctor()
   at Google.Apis.Json.NewtonsoftJsonSerializer..cctor()
  

Что происходит? Я могу запустить в контейнер и подтвердить наличие библиотеки DLL Newtonsoft.

Редактировать

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

RUN dotnet restore Работает после запуска nuget add source и даже dotnet restore --no-cache --force работает без ошибок. но я получаю эту ошибку во время выполнения.

Почему мой частный источник nuget вызывает эту проблему? Восстановление завершается успешно, и я вижу DLL. Частный источник nuget является репозиторием артефактов, зеркально отображающим репозитории Microsoft. Разве это не должно просто завершиться неудачей, если он не может найти нужный пакет?

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

1. Вы могли бы обойти всю проблему, используя функциональность JSON, встроенную в .netcore 3 . Я знаю, что это не решает вашу проблему, но может быть путем наименьшего сопротивления.

2. я не могу. библиотека, которую я использую, зависит от нее

Ответ №1:

Вы пробовали добавлять <RestoreProjectStyle>PackageReference</RestoreProjectStyle> в свой .csproj?

 <PropertyGroup>
   <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
   ...
</PropertyGroup>
  

Это помогло мне с аналогичной проблемой, когда я получал эти ошибки при запуске контейнера Docker, но не при отладке из VS на Mac.

Предоставлено Hanselman