Запрос Tmds.DBus работает в консольном приложении, но выдает исключение в моем приложении AvaloniaUI.C#

Место общения программистов C#
Anonymous
Запрос Tmds.DBus работает в консольном приложении, но выдает исключение в моем приложении AvaloniaUI.

Сообщение Anonymous »

Я хочу получить цвет акцента DE от d-bus, поэтому я пытаюсь вызвать org.freedesktop.portal.Desktop с интерфейсом org.freedesktop.portal.Settings, метод ReadOne с пространством имен org.freedesktop.appearance и ключевым акцентом-color:
Изображение

Я использую библиотеку Tmds.DBus и создаю простое консольное приложение для тестирования:

Код: Выделить всё

using Tmds.DBus.Protocol;

try
{
var connection = new DBusConnection(DBusAddress.Session!);
await connection.ConnectAsync();
var writer = connection.GetMessageWriter();
writer.WriteMethodCallHeader(
destination: "org.freedesktop.portal.Desktop",
path: "/org/freedesktop/portal/desktop",
@interface: "org.freedesktop.portal.Settings",
member: "ReadOne",
signature: "ss");

writer.WriteString("org.freedesktop.appearance");
writer.WriteString("accent-color");

var message = writer.CreateMessage();

var reply = await connection.CallMethodAsync(message,
(result, _) => result);

var reader = reply.GetBodyReader();
reader.AlignStruct();

reader.ReadInt64();
var red = (int)(reader.ReadDouble() * 255);
var green = (int)(reader.ReadDouble() * 255);
var blue = (int)(reader.ReadDouble() * 255);

Console.WriteLine($"RGB: {red}, {green}, {blue}");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Он работает и возвращает текущий результат:

Код: Выделить всё

RGB: 53, 168, 84
Но ТОТ ЖЕ код в моем приложении выдает исключение:

System.ArgumentOutOfRangeException: указанный аргумент находился вне диапазона допустимых значений.

в Tmds.DBus.Protocol.Reader..ctor(Boolean isBigEndian, ReadOnlySequence`1 последовательность, Дескрипторы UnixFdCollection, Int32 handleCount)

в Tmds.DBus.Protocol.Message.GetBodyReader()

в GMenu.Modules.LinuxSystem.LinuxThemeLoader.GetThemeHexAsync() в /home/themakarik/RiderProjects/g-menu/src/GMenu/Modules/LinuxSystem/LinuxThemeLoader.cs:line 27

Это код:

Код: Выделить всё

public async Task GetThemeHexAsync()
{
try
{
var connection = new DBusConnection(DBusAddress.Session!);
await connection.ConnectAsync();
var writer = connection.GetMessageWriter();
writer.WriteMethodCallHeader(
destination: "org.freedesktop.portal.Desktop",
path: "/org/freedesktop/portal/desktop",
@interface: "org.freedesktop.portal.Settings",
member: "ReadOne",
signature: "ss");

writer.WriteString("org.freedesktop.appearance");
writer.WriteString("accent-color");

var message = writer.CreateMessage();

var reply = await connection.CallMethodAsync(message,
(result, _) => result);

var reader = reply.GetBodyReader();
reader.AlignStruct();

reader.ReadInt64();
var red = (int)(reader.ReadDouble() * 255);
var green = (int)(reader.ReadDouble() * 255);
var blue = (int)(reader.ReadDouble() * 255);

return new Rgb(red, green, blue);
}
catch (Exception e)
{
logger.Error("Exception: {exception}", e);
return null;
}
}
Используемый код:

Код: Выделить всё

public override async void OnFrameworkInitializationCompleted()
{
try
{
//https://stackoverflow.com/questions/79933121/avaloniaui-strange-async-application-loading
var provider = Services;
LoadLocalization(provider);
var logger = provider.GetRequiredService();
logger.Information("Initializing GMenu...");
await LoadMaterialThemeAsync(provider);

logger.Information("Desktop files paths: {paths}", StaticConfiguration.PathToDesktopFiles);
logger.Information("Desktop files icons path: {paths}", StaticConfiguration.PathsToRefineIcon);

if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
desktop.MainWindow = new MainWindow { DataContext = Services.GetRequiredService() };

await LoadConfigurationAsync(provider).ConfigureAwait(false);

base.OnFrameworkInitializationCompleted();
}
catch (Exception e)
{
Services.GetRequiredService().Error(e, "An error occured while initializing the application.");
Console.WriteLine(e);
Environment.Exit(-1);
}
}

private async Task LoadMaterialThemeAsync(IServiceProvider provider)
{
using var scope = provider.CreateScope();

var themeLoader = scope.ServiceProvider.GetRequiredService();
var rgb = await themeLoader.GetThemeHexAsync();
var color = new Color(255, (byte)rgb.Red, (byte)rgb.Green, (byte)rgb.Blue );

var materialTheme = this.LocateMaterialTheme();
materialTheme.BaseTheme = BaseThemeMode.Inherit;
materialTheme.PrimaryColor = color;
materialTheme.SecondaryColor = color;

this.Resources["AccentColor"] = materialTheme.PrimaryColor;
}
Может кто-нибудь объяснить, почему происходят подобные странные вещи и как это исправить?

Вернуться в «C#»