【问题标题】:.NET Tizen and SignalR.NET Tizen 和 SignalR
【发布时间】:2021-06-11 14:24:38
【问题描述】:

我正在使用 .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,文化=中性,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 天,没有任何进展。也许有人对此有解决方案,或者某种解决方法。

【问题讨论】:

    标签: c# .net .net-core signalr tizen


    【解决方案1】:

    该错误可能是由于 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);
    }
    

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

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

    【讨论】:

    • 非常感谢您!这 7 行代码就像魔术一样工作。复制并粘贴它就可以了!我期待这样的事情,但对我来说,这种默认行为没有任何意义,因为该应用程序已经与更新版本的烘焙一起交付。 Microsoft.Extensions.DependencyInjection.Abstractions.dll 现在也找到了。我认为它是由于这种奇怪的行为而随机显示的,因为正如您所说,它不是 .NET Core 的一部分。
    • 你是对的。这没有任何意义。在桌面上,运行时主机 (.NET CLI) 在启动应用程序之前使用 .deps.json 文件解析依赖程序集,但出于性能原因,这在 Tizen 上是不可能的(对此感到羞耻) - 运行时在启动之前被初始化请求到达,甚至预取一些预安装的程序集。很久以前,我向运行时团队请求修复,但没有适用于所有可能情况的好的解决方案。总之,很抱歉浪费了您宝贵的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2018-09-21
    相关资源
    最近更新 更多