web-dev-qa-db-ja.com

さらに別のSystem.Runtime.InteropServicesエラー

MongoDBを使用するすべてのプロジェクトでは、ある時点で、ロードされないSystem.Runtime.InteropServicesライブラリに問題が発生します。

今回のエラーは興味深いものです。

Interop load exception

外部例外では、libのバージョン4.3.0.0を見つけることができません。しかし、内部の例外はバージョン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.3.0.0のパスで4.0.1.0を参照すると主張しているので

何かが壊れており、まったく同じlibで常に発生しています。このプロジェクトだけではありません。MongoDBをどこに含めても、このlibは依存関係として存在し、毎回ランダムな問題がいくつかあります。

手動でロードしようとすると:

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

それも失敗します。

System.Runtime.InteropServices.RuntimeInformation.dllがプロジェクトに含まれていても、ビルドフォルダーにコピーされないことがわかりました。


私は厄介な回避策を見つけました:メインexeにMongoDBを含めると、それを使用しなくても、Interop libに依存しているため、libがビルドフォルダーにコピーされ、その後の呼び出しが機能します。

11
Thomas

System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGetは、実際にDLLバージョン4.1.0.0でインストールします。混乱させることはないようですが、問題は発生しないようです。

MongoDB v2.4.4を直接または間接的に使用する各プロジェクトに次のNuGetをインストールしてみてください

  • System.Runtime.InteropServices.RuntimeInformation v4.3.
  • System.Runtime.InteropServices v4.3.

これでうまくいきました。

これが機能しない唯一のケースは、MSTestのユニット/統合テストで、MSTestがバインドリダイレクトを無視しているように見える(別の問題-かなり一般的なようです)ため、通常のコンソールexeを使用して統合テストを作成しました。

私はおそらく遠いですが、私自身の経験/観察は、MongoDB.Driver(v2.4.4)がSystem.Runtime.InteropServices.RuntimeInformationに依存していることを示唆しています。これは、NETStandardLibraryへのNuGetの依存関係によって満たされますが、System.Runtime .InteropServices.RuntimeInformationのSystem.Runtime.InteropServicesへの依存関係は処理されません。そのため、RuntimeInformationをアップグレードするだけでは不十分です。私の場合、すでにNETStandardLibrary(v1.6)に依存しているプロジェクトがたくさんあるので、4.3.0がすでにインストールされており、できれば、System.Runtime.InteropServices.RuntimeInformation v4.0.0を使用できませんでした。削除されません。私はあなたが見た両方の例外を異なる時間に見ました、そして上記のように両方のNuGetパッケージをインストールすることはそれらを解決しました。

3
Joseph Simpson

NugetパッケージSystem.Runtime.InteropServices.RuntimeInformationを必要とするすべてのmongodbnugetライブラリをアンインストールして再インストールすることで、この問題の解決策を見つけました。私の場合、それはmongodbnugetパッケージでした。

その後、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