.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.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 设备预装 System.Threading.Tasks.Extensions.dll
版本 4.1.1.0,但最新的 Microsoft.AspNetCore.SignalR.Client nuget 包依赖于 4.2.1.0 的 System.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")
.
如果这不能解决您的错误,请告诉我。
我正在使用 .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.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 设备预装 System.Threading.Tasks.Extensions.dll
版本 4.1.1.0,但最新的 Microsoft.AspNetCore.SignalR.Client nuget 包依赖于 4.2.1.0 的 System.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")
.
如果这不能解决您的错误,请告诉我。