.NET Tizen и SignalR

#c# #.net #.net-core #signalr #tizen

Вопрос:

Я создаю приложение Tizen ( .NET Tizen 4.0 ) с использованием .NET Core и Xamarin (https://docs.tizen.org/application/dotnet/).

Все работает отлично, за исключением одной вещи. Невозможно запустить соединение SignalR ( Microsoft.AspNetCore.SignalR.Client (5.0.7) ) с концентратором. Как только я создаю новый HubConnectionBuilder, возникает следующее исключение:

Исключение System.IO.FileLoadException: Не удалось загрузить файл или систему сборки.Нарезание резьбы.Задачи.Расширения, Версия=4.2.0.1, Культура=нейтральная, 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.Клиент, Перестраивающий проект, Удаляющий Tizen из Visual Studio, обновляющий все мои пакеты и даже удаляющий Visual Studio. Я буквально потратил на это свои последние 3 дня без какого-либо прогресса. Может быть, у кого-то есть решение этой проблемы или какой-то обходной путь.

Ответ №1:

Ошибка может быть вызвана печально известной проблемой несоответствия версий сборки на устройствах 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.СигналР.Клиентский пакет nuget зависит от System.Threading.Tasks.Extensions.dll версии 4.2.1.0. Таким образом, приложение сломается, потому что хост среды выполнения всегда сначала разрешает предварительно установленную сборку. (То же приложение будет работать без проблем на устройствах 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") .

Пожалуйста, дайте мне знать, если это не исправит вашу ошибку.

Комментарии:

1. Огромное вам спасибо! Эти 7 строк кода сработали как по волшебству. Скопируйте и вставьте, и это просто сработало! Я ожидал чего-то подобного, но такое поведение по умолчанию для меня не имеет никакого смысла, так как приложение уже поставляется с запеченным в более новой версии. Microsoft.Extensions.DependencyInjection.Abstractions.dll также найден сейчас. Я думаю, что он отображался случайным образом из-за этого странного поведения, потому что, как вы сказали, он не является частью .NET Core.

2. Ты прав. В этом нет никакого смысла. На настольных компьютерах узел среды выполнения (.NET CLI) разрешает зависимые сборки с помощью файла .deps.json непосредственно перед запуском приложения, но в Tizen это невозможно (позор) по соображениям производительности — среда выполнения инициализируется до поступления запроса на запуск и даже предварительно выбирает некоторые предустановленные сборки. Я запросил исправление для команды времени выполнения довольно давно, но не было хорошего решения, которое работало бы для всех возможных случаев. В любом случае, мне очень жаль, что я трачу ваше драгоценное время впустую.