gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:59:21 26 4
gpt4 key购买 nike

我们有一个 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,它是一个 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 页面。这反过来告诉我们程序集有一个依赖项,即 Microsoft ASP.NET Web API 2.2 客户端库,而后者又需要 JSON.net。

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

关于wpf - 如何阻止我的 ClickOnce 安装在 GAC 中要求 Newtonsoft.Json v4.5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30640507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com