我们有一个WPF桌面应用程序的ClickOnce部署,并且最近安装了Newtonsoft.Json版本6.0.8 NuGet软件包。
进行此更改并发布ClickOnce部署后,由于此错误消息,用户无法运行更新:
让我感到奇怪的第一件事是当我使用版本6.0.8时对版本4.5.0.0的依赖。
忽略了片刻,我在网上找到的所有信息都建议我确保将引用设置为本地复制,并且在Publish设置的Application Files对话框中,确保程序集设置为Include和Required。
我检查了这些,发现它们已经正确:
<< 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部署后,...
System.Net.Http.Formatting
,我们找到this Nugetmusthaves页。这进而告诉我们程序集具有一个依赖项,该依赖项是Microsoft ASP.NET Web API 2.2客户端库