“Newtonsoft.Json.JsonConvert”类型存在于“Newtonsoft.Json.dll”和“NuGetApi2.dll”中

Posted

技术标签:

【中文标题】“Newtonsoft.Json.JsonConvert”类型存在于“Newtonsoft.Json.dll”和“NuGetApi2.dll”中【英文标题】:The type 'Newtonsoft.Json.JsonConvert' exists in both 'Newtonsoft.Json.dll' and 'NuGetApi2.dll' 【发布时间】:2017-01-13 16:42:49 【问题描述】:

我正在尝试使用

将对象动态序列化到即时窗口中
Newtonsoft.Json.JsonConvert.SerializeObject(myObj);

但是我收到以下错误

“Newtonsoft.Json.dll”和“NuGetApi2.dll”中都存在“Newtonsoft.Json.JsonConvert”类型

当项目中未引用的.dll 被放置在该项目中引用的其他.dll 旁边的bin 文件夹中时会发生这种情况,并且其中包含相同的库(在本例中为NuGetApi2.dll 中的Newtonsoft.Json项目中没有引用)

为什么我只在使用即时/调试窗口时才得到这个异常,而不是在编译代码时?(编译时它工作正常,因为编译器使用的是项目中引用的 dll)

如何告诉 Visual Studio 使用哪个 .dll(最好不必停止程序运行)? 一种明显的方法是删除项目中未引用的.dll,......

更新:可在此处找到重现错误的解决方案:

https://github.com/liufa/Temp

解决方案压缩在WebApplication1.7z 中,我使用MVC 应用程序,在HomeControllerIndex 方法中重现添加断点,当它被击中时,将Newtonsoft.Json.JsonConvert.SerializeObject("sfdsdfsdf"); 粘贴到Visual Studio 的即时窗口中。

项目中的代码如下:

public class HomeController : Controller

    public ActionResult Index()
    
        var x = Newtonsoft.Json.JsonConvert.SerializeObject("sdfsdf");
#if DEBUG    
        var y = Newtonsoft.Json.JsonConvert.SerializeObject("sfssesss");
#endif
        return View(); //put breakpoint here then into immediate window paste Newtonsoft.Json.JsonConvert.SerializeObject("sdfsdf"); and you should get the error.
    

【问题讨论】:

NuGetApi2.dll 来自哪里?我的猜测是 JsonConvert 是内部的 - 这意味着编译器通常会忽略它,但允许在调试窗口中访问。 @JonSkeet 嗨,乔恩,如果正在交谈的文件夹,它们都来自 /bin。如果说 nugets Newtonsoft.Json.JsonConvert - Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll 和 NuGetApi2.dll 来自名为 ThirdParty 的文件夹,它与其他 .dlls 如 Mindscape.LightSpeed.dllMicrosoft.SqlServer.ConnectionInfo 等。我的猜测是 NuGetApi2.dll 坐在那里作为对依赖于 JSON 和其他常用库的 3rd 方 dll 的支持...... 但是您是从哪里创建该文件夹的?如果我们能够重现该问题,我们可以使用该 DLL……在网上没有明显的来源。 (我可以可能使用手写库手动重现它,但重现您的确切问题会很好。) 嗯...在一个也有 Json.NET 的项目中尝试该 DLL 会给我一个编译时错误。有趣的。您的项目中是否也Newtonsoft.Json.dll 的引用? (基本上,我无法重现这个 - 我得到一个编译时错误或没有中间窗口错误。你能显示一些在你的项目中使用Json.NET 的代码吗?我希望能够重现这个.. .) 那么你为什么要把它放在那里呢?基本上你处于一个非常奇怪的情况,在编译时不存在的程序集中进行复制。 (所以难怪“当它编译时它工作正常”...)我强烈建议您摆脱这种奇怪的部署基础架构 - 并使用 嵌入另一个程序集的 DLL公开... 【参考方案1】:

默认情况下,.Net 网站在启动时会加载 bin 文件夹中的所有程序集。您可以通过修改 web.config 文件来更改此行为,在这种情况下,您需要列出您想要加载的程序集。

这是一个仅加载版本 1.0.0.0 的 MySite.dll 的示例

<system.web>
  <compilation>
    <assemblies>
      <remove assembly="*" />
      <add assembly="MySite, Version=1.0.0.0, Culture=neutral />
    </assemblies>
  </compilation>
</system.web>

如果您只加载您需要的程序集而不加载 NuGetApi2 程序集,这应该可以解决您的问题

【讨论】:

尝试了以下&lt;compilation debug="true" targetFramework="4.5" &gt; &lt;assemblies&gt; &lt;remove assembly="NuGetApi2, Version=3.0.0.0, Culture=neutral" /&gt; &lt;/assemblies&gt; &lt;/compilation&gt;,它仍然给出相同的消息(Newtonsoft.Json.JsonConvert.SerializeObject("sfsdf"); The type 'Newtonsoft.Json.JsonConvert' exists in both 'Newtonsoft.Json.dll' and 'NuGetApi2.dll' 当然没用,你没有按照我的建议去做。您的删除指令什么都不做,因为该 dll 不在配置中。

以上是关于“Newtonsoft.Json.JsonConvert”类型存在于“Newtonsoft.Json.dll”和“NuGetApi2.dll”中的主要内容,如果未能解决你的问题,请参考以下文章