我正在构建一个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:无法加载文件或程序集'System.Threading.Tasks.Extensions,Version=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卸载Tizen、更新所有包,甚至卸载Visual。我在这上面浪费了最后3天,没有任何进展。也许有人有办法解决这个问题,或者某种解决办法。
发布于 2021-06-11 06:24:38
此错误可能是由于Tizen设备上臭名昭著的程序集版本错配问题造成的。
说明:Tizen4.0设备附带了预装的System.Threading.Tasks.Extensions.dll程序集4.1.1.0,但是最新的Microsoft.AspNetCore.SignalR.Client nuget包依赖于4.2.1.0的System.Threading.Tasks.Extensions.dll。因此,应用程序会中断,因为运行时主机总是首先解析预先安装的程序集。(同一应用程序在Tizen5.5设备上运行时不会出现问题,因为预装的组装版本为4.3.1.0。)但是,我不知道为什么Microsoft.Extensions.DependencyInjection.Abstractions.dll不能被解析,因为它不是.NET核心运行时的一部分,也不是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")的内容。
如果这不能纠正你的错误,请告诉我。
https://stackoverflow.com/questions/67919966
复制相似问题