it-swarm.com.ru

Еще одна ошибка System.Runtime.InteropServices

Каждый проект, который у нас есть с MongoDB, в какой-то момент будет иметь проблему с библиотекой System.Runtime.InteropServices, которая не загружается.

На этот раз ошибка интересна:

 Interop load exception

Внешнее исключение не может найти версию 4.3.0.0 библиотеки lib . Но внутреннее исключение не может найти версию 4.0.0.0

У кого-нибудь есть идеи по этому поводу?


Больше информации о проблеме:

 enter image description here

Итак, NuGet имеет установленную 4.3.0.0

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="System.Runtime" version="4.3.0" targetFramework="net462" />
  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net462" />
</packages>

packages.config подтверждает, что у меня установлена ​​4.3.0.0,

однако, app.config, который всегда кажется не синхронизированным с реальностью:

  <dependentAssembly>
    <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
  </dependentAssembly>

Добавлена ​​строка о версии 4.0.1.0

В той же строке .. csproj это чушь:

<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>x:\Packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
</Reference>

Поскольку он претендует на ссылку 4.0.1.0 с путем 4.3.0.0

Что-то сломано, и это всегда происходит с той же самой библиотекой; не только этот проект: где бы я ни включал MongoDB, эта библиотека является зависимой, и каждый раз возникают некоторые случайные проблемы с ней.

Когда я пытаюсь загрузить вручную:

        var Name = new AssemblyName("System.Runtime.InteropServices.RuntimeInformation, Version=4.3.0.0");
        var Asm = Assembly.Load(Name);

это также терпит неудачу.

Я обнаружил, что System.Runtime.InteropServices.RuntimeInformation.dll НЕ копируется в папку сборки, даже если она включена в проект.


Я нашел неприятный обходной путь: Если я включаю MongoDB в основной exe-файл, даже если я его не использую, он зависит от библиотеки Interop, и это заставляет библиотеку копироваться в папку сборки, а затем последующие звонки работают.

10
Thomas

System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGet действительно устанавливает DLL с версией 4.1.0.0; хотя это сбивает с толку, похоже, не создает никаких проблем.

Попробуйте установить следующие NuGets на каждый проект, который прямо или косвенно использует MongoDB v2.4.4

  • System.Runtime.InteropServices.RuntimeInformation v4.3.0
  • System.Runtime.InteropServices v4.3.0

Это сработало для меня. 

Единственным случаем, когда это не сработало, был модульный/интеграционный тест MSTest, где MSTest, похоже, игнорирует перенаправления привязки (отдельная проблема - кажется довольно распространенной), поэтому я создал свой интеграционный тест, используя обычный консольный exe-файл.

Я, вероятно, далеко, но мой собственный опыт/наблюдения показали, что MongoDB.Driver (v2.4.4) имеет зависимость от System.Runtime.InteropServices.RuntimeInformation, которая удовлетворяется его зависимостью NuGet от NETStandardLibrary, но это System.Runtime Зависимость .InteropServices.RuntimeInformation от System.Runtime.InteropServices не рассматривается. Вот почему недостаточно просто обновить RuntimeInformation. В моем случае у меня есть много проектов, которые уже имеют зависимость от NETStandardLibrary (v1.6), и поэтому я не мог использовать System.Runtime.InteropServices.RuntimeInformation v4.0.0, если я хотел, поскольку 4.3.0 уже установлена ​​и может ' быть удаленным. Я видел как исключения, которые вы видели, в разное время, так и установка обоих пакетов NuGet, как описано выше, разрешила их.

3
Joseph Simpson

Я нашел решение этой проблемы, удалив каждую библиотеку nuget mongodb, которой нужен пакет nuget System.Runtime.InteropServices.RuntimeInformation, и переустановив ее. В моем случае это был пакет mongodb nuget.

После этого я обновил System.Runtime.InteropServices.RuntimeInformation до 4.3 и добавил следующее в app.config, даже если это не имеет смысла:

<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />

0
jboo

Платформа таргетинга 4.7 или 4.7.1 решит проблему . Это потому, что существуют некоторые конфликты на стороне стандарта .net 2

0
Shadi Namrouti