“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 应用程序,在HomeController
、Index
方法中重现添加断点,当它被击中时,将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
的文件夹,它与其他 .dll
s 如 Mindscape.LightSpeed.dll
和 Microsoft.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 程序集,这应该可以解决您的问题
【讨论】:
尝试了以下<compilation debug="true" targetFramework="4.5" > <assemblies> <remove assembly="NuGetApi2, Version=3.0.0.0, Culture=neutral" /> </assemblies> </compilation>
,它仍然给出相同的消息(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”中的主要内容,如果未能解决你的问题,请参考以下文章