如何阻止我的ClickOnce安装在GAC中要求Newtonsoft.Json v4.5?

时间:2015-06-04 09:47:24

标签: wpf json.net nuget clickonce

我们有一个WPF桌面应用程序的ClickOnce部署,最近安装了Newtonsoft.Json版本6.0.8 nuget包。

进行此更改并发布ClickOnce部署后,由于此错误消息,用户无法运行更新:

The error message shown when updating the application

当我使用版本6.0.8时,首先让我感到奇怪的是依赖于版本4.5.0.0。

暂时忽略这一点,我在网上找到的所有内容都表明我确保将引用设置为复制本地,并且在发布设置的“应用程序文件”对话框中,我确保将程序集设置为包含和必需。

我已经检查了这些,发现它们已经是正确的了:

Reference properties

enter image description here

所以我有点难过。如何将ClickOnce应用程序要求将此程序集的旧版本安装到GAC中?

任何超越显而易见的想法都会受到大力赞赏!

更新1

我不知道这是多么有用,但我发现如果我将引用设置为不在本地复制(使其成为先决条件而不是包含),并再次发布,那么当我安装应用程序,我得到相同的错误,但对于正确的版本。

Same error message but for version 6

更新2

有趣。如果我从项目中卸载nuget包(删除了引用),然后确保它根本不在ClickOnce包中,我仍然会收到原始错误。这必须意味着我引用的东西引用了Newtonsoft.Json版本4.5.0.0 ??

更新3

所以我找到了导致错误的引用项目。但该项目安装了Newtonsoft.Json版本6.0.8,因此我仍然不了解此版本4.5.0.0依赖项的来源。

更新4

战斗仍在继续。我设法承担了一些责任,以便在WPF应用程序或它引用的任何项目中没有Newstonsoft.Json引用,并且它们都没有安装nuget包。我现在可以发布并安装该软件包,但是当我运行应用程序时,我会遇到以下异常:

Application startup exception

更新5

我已经找到了原因,并且它是主视图模型中的这行代码:

var response = await client.PostAsJsonAsync("api/Common/MyApiMethod", data).ContinueWith(t => t.Result.EnsureSuccessStatusCode());

一旦我去PostAsJsonAsync方法附近的任何地方,我在更新4中得到上面显示的错误消息。但是,该扩展方法是HttpClientExtensions类的一部分,它存在于System.Net.Http.Formatting程序集中。

所以我想问题是为什么程序集需要4.5.0.0版本的GAC安装,以及为什么之前没有这样做,但最重要的是 - 如何防止这种依赖GAC?

更新6

发现上面提到的程序集是通过此路径引用的... C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies \ System.Net.Http.Formatting.dll。 ..所以它显然是一个ASP.NET MVC程序集。所以我想我面临着将最新的MVC安装为nuget包(这对于WPF项目来说真的很糟糕)或者将连接到Web API的方法改为替代方案(可能更好)。

Zache的回答是对问题的简要总结。 PostAsJsonAsync方法属于System.Net.Http.Formatting,它是一个MVC扩展程序集。这又依赖于旧版本的NewstonSoft.Json,因此依赖于GAC依赖。

我删除了对System.Net.Http.Formatting的引用,并替换了连接到服务器的代码,该代码现在使用最新的Newtonsoft.Json来序列化发送到服务器的数据。

然后将此序列化数据打包到StringContent对象中并发送到服务器,并且可以将响应从JSON反序列化为请求的类型。

var data = new { /* Anonymous object definition*/ };
var json = JsonConvert.SerializeObject(data);
var httpContent = new StringContent(json, Encoding.Unicode, "application/json");

try
{
    var response = await client.PostAsync("api/MyController/MyMethod", httpContent).ContinueWith(t => t.Result.EnsureSuccessStatusCode());
    var returnData = await response.Content.ReadAsStringAsync();
    var result = returnData;
    var deserialized = JsonConvert.DeserializeObject<T>(result);

1 个答案:

答案 0 :(得分:2)

查找 System.Net.Http.Formatting ,我们找到this nugetmusthaves-page。这反过来告诉我们程序集具有依赖性,即 Microsoft ASP.NET Web API 2.2客户端库,而这又需要 JSON.net

您是如何将 System.Net.Http.Formatting 程序集添加到您的解决方案中的?你用过nuget吗?尝试删除它并通过nuget安装它,这应该可以工作:)