【发布时间】: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,......
更新:可在此处找到重现错误的解决方案:
解决方案压缩在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的文件夹,它与其他.dlls 如Mindscape.LightSpeed.dll和Microsoft.SqlServer.ConnectionInfo等。我的猜测是NuGetApi2.dll坐在那里作为对依赖于 JSON 和其他常用库的 3rd 方 dll 的支持...... -
但是您是从哪里创建该文件夹的?如果我们能够重现该问题,我们可以使用该 DLL……在网上没有明显的来源。 (我可以可能使用手写库手动重现它,但重现您的确切问题会很好。)
-
嗯...在一个也有 Json.NET 的项目中尝试该 DLL 会给我一个编译时错误。有趣的。您的项目中是否也有对
Newtonsoft.Json.dll的引用? (基本上,我无法重现这个 - 我得到一个编译时错误或没有中间窗口错误。你能显示一些在你的项目中使用Json.NET的代码吗?我希望能够重现这个.. .) -
那么你为什么要把它放在那里呢?基本上你处于一个非常奇怪的情况,在编译时不存在的程序集中进行复制。 (所以难怪“当它编译时它工作正常”...)我强烈建议您摆脱这种奇怪的部署基础架构 - 并使用 不 嵌入另一个程序集的 DLL公开...
标签: c# .net dll visual-studio-2013 nuget