web-dev-qa-db-fra.com

Encore une autre erreur System.Runtime.InteropServices

Chaque projet que nous avons avec MongoDB aura, à un point sur un autre, un problème avec la bibliothèque System.Runtime.InteropServices qui ne se charge pas.

Cette fois l'erreur est intéressante:

 Interop load exception

L'exception externe ne trouve pas la version 4.3.0.0 de la lib. Mais l'exception interne ne trouve pas la version 4.0.0.0

Est-ce que quelqu'un a une idée à ce sujet?


Plus d'informations sur le problème:

 enter image description here

Donc, NuGet a 4.3.0.0 installé

<?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 confirme que j'ai installé la version 4.3.0.0,

cependant, app.config qui semble toujours ne pas être en phase avec la réalité:

  <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>

Une ligne a été ajoutée à propos de la version 4.0.1.0

Dans la même ligne .. le csproj est un non-sens:

<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>

Puisqu'il prétend faire référence à 4.0.1.0 avec le chemin de 4.3.0.0

Il y a quelque chose de cassé et il se passe toujours avec cette même bibliothèque exacte; pas seulement ce projet: partout où j'inclus MongoDB, cette lib est une dépendance et chaque fois, il y a des problèmes aléatoires.

Quand j'essaye de charger manuellement:

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

ça échoue aussi.

Je constate que System.Runtime.InteropServices.RuntimeInformation.dll n'est PAS copié dans le dossier de construction, même s'il est inclus dans le projet.


J'ai trouvé une solution de contournement désagréable: Si j'inclus MongoDB dans l'exe principal, même si je ne l'utilise pas, il a une dépendance sur la bibliothèque Interop, ce qui a forcé la bibliothèque à être copiée dans le dossier de construction et alors les appels suivants fonctionnent.

10
Thomas

Le System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGet installe en effet un DLL avec la version 4.1.0.0; Bien que déroutant, cela ne semble pas créer de problèmes.

Essayez d'installer les NuGets suivants sur chaque projet utilisant directement ou indirectement MongoDB v2.4.4

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

Cela a fonctionné pour moi. 

Le seul cas où cela n'a pas fonctionné était un test d'unité/d'intégration MSTest dans lequel MSTest semble ignorer les redirections de liaison (problème distinct - il semble assez courant), c'est pourquoi j'ai créé mon test d'intégration à l'aide d'un fichier exe de console standard.

Je suis probablement loin, mais mes propres expériences/observations suggèrent que MongoDB.Driver (v2.4.4) a une dépendance sur System.Runtime.InteropServices.RuntimeInformation, qui est satisfaite par sa dépendance NuGet sur NETStandardLibrary, mais System.Runtime La dépendance de .InteropServices.RuntimeInformation à System.Runtime.InteropServices n'est pas prise en charge. C'est pourquoi il ne suffit pas de mettre à niveau RuntimeInformation. Dans mon cas, de nombreux projets dépendent déjà de NETStandardLibrary (v1.6) et je ne pouvais donc pas utiliser System.Runtime.InteropServices.RuntimeInformation v4.0.0 si je le souhaitais car 4.3.0 est déjà installé et peut t être enlevé. J'ai vu les deux exceptions que vous avez vues, à des moments différents, et les a résolues en installant les deux packages NuGet décrits ci-dessus.

3
Joseph Simpson

J'ai trouvé une solution à ce problème en désinstallant chaque bibliothèque de nuget mongodb nécessitant le package de nuget System.Runtime.InteropServices.RuntimeInformation et en le réinstallant. Dans mon cas, c’était le paquet mongodb nuget.

Après, j'ai mis à niveau System.Runtime.InteropServices.RuntimeInformation à la version 4.3 et ajouté ce qui suit dans app.config même si cela n'a aucun sens

<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

Le cadre de ciblage 4.7 ou 4.7.1 résoudrait le problème. En effet, il existe des conflits du côté de la norme .net 2.

0
Shadi Namrouti