MongoDBを使用するすべてのプロジェクトでは、ある時点で、ロードされないSystem.Runtime.InteropServicesライブラリに問題が発生します。
今回のエラーは興味深いものです。
外部例外では、libのバージョン4.3.0.0を見つけることができません。しかし、内部の例外はバージョン4.0.0.0を見つけることができません
誰かがそれについて考えを持っていますか?
問題の詳細:
したがって、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がビルドフォルダーにコピーされ、その後の呼び出しが機能します。
System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGetは、実際にDLLバージョン4.1.0.0でインストールします。混乱させることはないようですが、問題は発生しないようです。
MongoDB v2.4.4を直接または間接的に使用する各プロジェクトに次のNuGetをインストールしてみてください
これでうまくいきました。
これが機能しない唯一のケースは、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パッケージをインストールすることはそれらを解決しました。
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" />
フレームワーク4.7または4.7.1をターゲットにすると問題が解決します。これは、.net標準2の側でいくつかの競合があるためです。