.NET Tizen 和 SignalR

.NET Tizen and 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: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The located assembly's manifest definition does not match the assembly reference. (Exception from 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 设备预装 System.Threading.Tasks.Extensions.dll 版本 4.1.1.0,但最新的 Microsoft.AspNetCore.SignalR.Client nuget 包依赖于 4.2.1.0System.Threading.Tasks.Extensions.dll。所以应用程序会中断,因为 运行time 主机总是首先解析预安装的程序集。 (同样的应用程序将 运行 在 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);
}

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

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