Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同版本的Newtonsoft给出了一个错误_C#_Dll_Json.net_Assembly Binding Redirect - Fatal编程技术网

C# 不同版本的Newtonsoft给出了一个错误

C# 不同版本的Newtonsoft给出了一个错误,c#,dll,json.net,assembly-binding-redirect,C#,Dll,Json.net,Assembly Binding Redirect,我试图在我的站点中运行两个版本的Newtonsoft.Json.dll,因为我使用了两个不同的插件,需要不同版本的Newtonsoft.Json.dll版本6和版本9 遇到了这篇文章,这是同样的问题(但对于Win表单,如果这有什么区别的话)。所以我的web.config文件看起来像 <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed

我试图在我的站点中运行两个版本的
Newtonsoft.Json.dll
,因为我使用了两个不同的插件,需要不同版本的
Newtonsoft.Json.dll
版本6和版本9

遇到了这篇文章,这是同样的问题(但对于Win表单,如果这有什么区别的话)。所以我的web.config文件看起来像

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <codeBase version="6.0.0.0" href="Newtonsoft.Json.dll" />
    <codeBase version="9.0.1.0" href="dlls\9.0.0.0\Newtonsoft.Json.dll" />
  </dependentAssembly> 

我知道在添加第二个插件之前,NSJson的第6版可以正常工作。如果我查看dll的属性,在“详细信息”选项卡下,我会看到文件和产品版本为9.0.1.19813

然后,我在bin目录下创建了一个名为dlls\9.0.0.0\的文件夹,将dll放在这里。如果版本列为
version=“9.0.0.0”
我会得到错误

无法加载文件或程序集“Newtonsoft.Json,Version=9.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed”或其依赖项之一。系统找不到指定的文件。

如果我将版本更改为
version=“9.0.1.0”
,那么我将获得

无法加载文件或程序集“Newtonsoft.Json,Version=9.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(HRESULT的例外:0x8013100)


这“似乎”意味着我更接近解决方案,而不是将版本设置为9.0.0.0,但我不知道如何查看它要查找的清单定义或应该设置为什么?当然,我可能完全错了,不知道如何解决这个问题?

不幸的是,您尝试使用CLR做的事情是不可能的(从技术上讲,它是使用外部别名,但不是!),您只能在
AppDomain
中加载程序集的一个版本(这里是您的应用程序)

这就是“绑定重定向”的用武之地,您需要您的配置来告诉运行时,每当它尝试加载
Newtonsoft.Json,Version=6.0.0.0,…
时,就使用Version
9.0.0
或任何版本

绑定重定向配置如下所示:

<dependentAssembly>
<assemblyIdentity name="C"  
                  publicKeyToken="32ab4ba45e0a69a1"  
                  culture="en-us" />  

<bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

您必须使用程序集绑定重定向。 您的代码如下所示:

<dependentAssembly>
<assemblyIdentity name="C"  
                  publicKeyToken="32ab4ba45e0a69a1"  
                  culture="en-us" />  

<bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>


.

这是否回答了一个库/nuget包的整合版本真的是件坏事。。。尽可能避免发生这种情况。您可以尝试使用分离的绑定重新检测在两个Assembile上分离库(第一个程序集到v9.0.1.0,第二个到v6.0.0.0)。但我不能保证它能起作用。这能回答你的问题吗?这是两个DLL,一个位于bin目录下,另一个位于bin目录下的文件夹下。我没有使用NuGet版本号需要与实际部署的程序集匹配。在bin folder中检查它的版本号那么我上面提供的链接给我的印象是如何做到这一点的呢?好的,从技术上来说,通过外部化是可行的,但我甚至不接受这个想法,这不是你应该用来解决钻石依赖问题的东西。