另一个 System.Runtime.InteropServices 错误
Yet another System.Runtime.InteropServices error
我们使用 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
有些东西坏了,它总是发生在完全相同的库上;不仅仅是这个项目:在我包含 MongoDB 的任何地方,这个库都是作为依赖项出现的,并且每次都会出现一些随机问题。
当我尝试手动加载时:
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 库,这会强制将库复制到构建文件夹,然后后续调用工作。
我通过卸载每个需要 nuget 包 System.Runtime.InteropServices.RuntimeInformation 的 mongodb nuget 库并重新安装它找到了解决此问题的方法。在我的例子中,它是 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" />
System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGet 确实安装了版本为 4.1.0.0 的 DLL;虽然令人困惑,但它似乎并没有造成任何问题。
尝试在每个直接或间接使用 MongoDB v2.4.4
的项目上安装以下 NuGets
- System.Runtime.InteropServices.RuntimeInformation v4.3.0
- System.Runtime.InteropServices v4.3.0
这对我有用。
唯一不起作用的情况是 MSTest unit/integration 测试,其中 MSTest 似乎忽略了绑定重定向(单独的问题 - 似乎很常见),因此我使用常规控制台 exe.
我可能跑题了,但我自己的 experiences/observations 建议 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 包解决了它们。
目标框架 4.7 或 4.7.1 可以解决问题。
这是因为 .net standard 2
方面存在一些冲突
我们使用 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
有些东西坏了,它总是发生在完全相同的库上;不仅仅是这个项目:在我包含 MongoDB 的任何地方,这个库都是作为依赖项出现的,并且每次都会出现一些随机问题。
当我尝试手动加载时:
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 库,这会强制将库复制到构建文件夹,然后后续调用工作。
我通过卸载每个需要 nuget 包 System.Runtime.InteropServices.RuntimeInformation 的 mongodb nuget 库并重新安装它找到了解决此问题的方法。在我的例子中,它是 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" />
System.Runtime.InteropServices.RuntimeInformation v4.3.0 NuGet 确实安装了版本为 4.1.0.0 的 DLL;虽然令人困惑,但它似乎并没有造成任何问题。
尝试在每个直接或间接使用 MongoDB v2.4.4
的项目上安装以下 NuGets- System.Runtime.InteropServices.RuntimeInformation v4.3.0
- System.Runtime.InteropServices v4.3.0
这对我有用。
唯一不起作用的情况是 MSTest unit/integration 测试,其中 MSTest 似乎忽略了绑定重定向(单独的问题 - 似乎很常见),因此我使用常规控制台 exe.
我可能跑题了,但我自己的 experiences/observations 建议 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 包解决了它们。
目标框架 4.7 或 4.7.1 可以解决问题。 这是因为 .net standard 2
方面存在一些冲突