如何解决.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.1
或 Microsoft.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 设备上臭名昭著的程序集版本不匹配问题造成的。
说明:Tizen 4.0 设备预装了 4.1.1.0 版本的 System.Threading.Tasks.Extensions.dll
程序集,但最新的 Microsoft.AspNetCore.SignalR.Client nuget 包依赖于 4.2.1.0 的 System.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 举报,一经查实,本站将立刻删除。