微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET Tizen 和 SignalR

如何解决.NET Tizen 和 SignalR

我正在使用 .NET Core 和 Xamarin (https://docs.tizen.org/application/dotnet/) 构建一个 Tizen 应用程序 (.NET Tizen 4.0)。

一切都很好,除了一件事。无法启动与集线器的 SignalR (Microsoft.AspNetCore.SignalR.Client (5.0.7)) 连接。一旦我创建了一个新的 HubConnectionBuilder,就会抛出以下异常:

System.IO.FileLoadException:无法加载文件或程序集“System.Threading.Tasks.Extensions,版本=4.2.0.1,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”。定位的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)

关于这个最奇怪的部分。这个异常在我不做任何事情的情况下发生了变化。例如,如果我拿了一杯饮料,回来再运行一次,就会发现另一个组件丢失了。现在我看到 System.Threading.Tasks.Extensions,Version=4.2.0.1Microsoft.Extensions.DependencyInjection.Abstractions,Version=5.0.0 丢失了。最重要的是:我不主动使用这两个软件包中的任何一个

所以基本上,只要我删除以下代码行,一切正常。

this.hub = new HubConnectionBuilder().WithUrl($"wss://{Settings.Instance.ServerAddress}/deviceHub").Build();

我已经尝试添加缺少的包,但没有成功。问题是,由于某些非常奇怪的原因,在 SignalR.Client 包中找不到这些包(只是我的猜测)。我还尝试删除 SignalR.Client、重建项目、从 Visual Studio 卸载 Tizen、更新我的所有包,甚至卸载 Visual Studio。我真的浪费了我最后 3 天的时间,没有任何进展。也许有人对此有解决方案,或者某种解决方法

解决方法

该错误可能是由于 Tizen 设备上臭名昭著的程序集版本不匹配问题造成的。

https://developer.samsung.com/tizen/blog/en-us/2020/02/17/assembly-loading-problem-in-tizen-net-applications

说明:Tizen 4.0 设备预装了 4.1.1.0 版本的 System.Threading.Tasks.Extensions.dll 程序集,但最新的 Microsoft.AspNetCore.SignalR.Client nuget 包依赖于 4.2.1.0System.Threading.Tasks.Extensions.dll。因此应用程序将中断,因为运行时主机总是首先解析预安装的程序集。 (同一个应用程序在 Tizen 5.5 设备上可以毫无问题地运行,因为预安装的程序集版本是 4.3.1.0。)但是,我不确定为什么 Microsoft.Extensions.DependencyInjection.Abstractions.dll 无法解决,因为它不是 . NET Core 运行时,而不是预先安装在 Tizen 设备上。

简而言之,您可以在您的应用程序的 Main() 中添加以下事件处理程序并检查问题是否仍然存在。

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += (object s,ResolveEventArgs eventArgs) =>
    {
        var appDir = Path.GetDirectoryName(typeof(App).Assembly.Location);
        var assemblyName = eventArgs.Name.Split(',')[0];
        var assemblyPath = Path.Combine(appDir,assemblyName + ".dll");
        return File.Exists(assemblyPath) ? Assembly.LoadFile(assemblyPath) : null;
    };
    ..
    app.Run(args);
}

应用此更改时,请确保未在 http://tizen.org/metadata/prefer_dotnet_aot 中设置 tizen-manifest.xml 元数据值。如果已设置,您需要将 assemblyPath 更改为类似 Path.Combine(appDir,".native_image",assemblyName + ".ni.dll") 的内容。

如果这不能解决您的错误,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?