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

问题描述 投票:4回答:1

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

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

“更新应用程序时显示的错误消息”

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

忽略了片刻,我在网上找到的所有信息都建议我确保将引用设置为本地复制,并且在Publish设置的Application Files对话框中,确保程序集设置为IncludeRequired

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

“参考属性”

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9qRkhyZC5wbmcifQ==” alt =“在此处输入图像描述”>

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

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

UPDATE 1

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

<<

UPDATE 2

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

UPDATE 3

所以我找到了引起错误的引用项目。但是那个项目已经安装了Newtonsoft.Json版本6.0.8,所以我仍然不明白这个版本4.5.0.0依赖来自何处。

UPDATE 4

战斗继续。我设法将一些责任转移到了WPF应用程序或其引用的任何项目中,没有Newstonsoft.Json引用,并且它们都没有安装NuGet软件包。我现在可以发布并安装该软件包,但是当我

run

应用程序时,会出现此异常:“应用程序启动异常”

UPDATE 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的依赖?

UPDATE 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的方法更改为替代方法(可能更可取)。

SOLUTION

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);

我们有一个WPF桌面应用程序的ClickOnce部署,最近安装了Newtonsoft.Json版本6.0.8 NuGet软件包。进行更改并发布ClickOnce部署后,...
wpf json.net nuget clickonce
1个回答
2
投票
查找

System.Net.Http.Formatting

,我们找到this Nugetmusthaves页。这进而告诉我们程序集具有一个依赖项,该依赖项是Microsoft ASP.NET Web API 2.2客户端库
© www.soinside.com 2019 - 2024. All rights reserved.