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

How can I stop my ClickOnce install from requiring Newtonsoft.Json v4.5 in the GAC?

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

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

让我感到奇怪的第一件事是当我使用 6.0.8 版本时对版本 4.5.0.0 的依赖。

暂时忽略这一点,我在网上找到的所有内容都建议我确保将引用设置为复制本地,并且在 Application Files 对话框中78=]Publish 设置,我确保程序集设置为 IncludeRequired.

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

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

任何超出显而易见的想法将不胜感激!

更新 1

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

更新 2

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

更新 3

所以我找到了导致错误的引用项目。但是那个项目安装了Newtonsoft.Json版本6.0.8,所以我还是不明白这个版本4.5.0.0的依赖是从哪里来的。

更新 4

战斗还在继续。我设法转移了一些责任,使得 WPF 应用程序或它引用的任何项目中没有 Newstonsoft.Json 引用,并且其中 none 安装了 NuGet 包。我现在可以发布和安装包,但是当我 运行 应用程序时,我得到这个异常:

更新 5

嗯,我找到原因了,就是主视图模型中的这行代码:

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

只要我靠近 PostAsJsonAsync 方法,就会在更新 4 中收到上面显示的错误消息。但是,该扩展方法是 HttpClientExtensions class 的一部分,它位于 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,这是一个 ASP.NET 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);

查找 System.Net.Http.Formatting 我们找到 this nugetmusthaves-page。这反过来告诉我们程序集有一个依赖项 Microsoft ASP.NET Web API 2.2 Client Libraries 反过来需要 JSON.net.

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