Я пытаюсь получить доступ к c libnotify из моего кода C#, чтобы использовать libnotify на моем ноутбуке linux с ядром dotnet.
Но каждый раз возникает проблема с получением значений из библиотеки.C#: Получить значения из libnotify c struct
Это проблематична с код:
typedef struct _NotifyNotification NotifyNotification;
typedef struct _NotifyNotificationPrivate NotifyNotificationPrivate;
struct _NotifyNotification
{
/*<private>*/
GObject parent_object;
NotifyNotificationPrivate *priv;
};
struct _NotifyNotificationPrivate
{
guint32 id;
char *app_name;
char *summary;
char *body;
/* NULL to use icon data. Anything else to have server lookup icon */
char *icon_name;
/*
* -1 = use server default
* 0 = never timeout
* > 0 = Number of milliseconds before we timeout
*/
gint timeout;
GSList *actions;
GHashTable *action_map;
GHashTable *hints;
gboolean has_nondefault_actions;
gboolean updates_pending;
gulong proxy_signal_handler;
gint closed_reason;
};
NotifyNotification *
notify_notification_new (const char *summary,
const char *body,
const char *icon);
Теперь я создал два структуры в моих C# код и ехЬегп метод:
[StructLayout(LayoutKind.Explicit)]
internal struct NotifyNotification
{
[FieldOffset(1)]
public NotifyNotificationPrivate priv;
}
[StructLayout(LayoutKind.Explicit)]
internal struct NotifyNotificationPrivate
{
[FieldOffset(0)]
public uint id;
[FieldOffset(1)]
public IntPtr app_name;
[FieldOffset(2)]
public IntPtr summary;
[FieldOffset(5)]
public int timeout;
}
[DllImport("libnotify.so.4", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr notify_notification_new([MarshalAs(UnmanagedType.LPStr)] string summary,
[MarshalAs(UnmanagedType.LPStr)] string body,
[MarshalAs(UnmanagedType.LPStr)] string icon);
С помощью этого кода я бросил все, чтобы структуры:
NotifyNotification no = (NotifyNotification) Marshal.PtrToStructure(not, typeof(NotifyNotification));
Console.WriteLine(Marshal.PtrToStringAnsi(no.priv.summary));
Основы работают, и я могу вызывать другие функции из libnotify с помощью poi nter от notify_notification_new-метод. Но в последней строке, с WriteLine, отладчик говорит:
The program '...dll' has exited with code 0 (0x00000000).
Там не является исключением, и нет ошибок. Что происходит не так? Это проблема с ядром dotnet? Потому что он все еще в бета-версии?
Как получить текст из свойств app_name, summary, body ??
Благодарим вас за помощь.
Хорошо, спасибо за ваш ответ. Это имеет смысл. Но: После сортировки моего не указателя на NotifyNotification-struct значение priv: _0x0000000000000001_. Поэтому я не могу его маршалировать в NotifyNotificationPrivate-struct. Зачем? Это должно быть другой ценностью, не так ли? – bittnerd
@bittnerd Ах, потому что GObject - это структура, а не указатель. https://github.com/GNOME/glib/blob/master/gobject/gobject.h#L245-L252. Лучше всего сделать небольшую библиотеку C, в которую вы можете передать «NotifyNotification *» и получить «NotifyNotificationPrivate». Таким образом, компилятор C может выполнять вычисления смещения поля, и вам не нужно пытаться работать над структурой GObject, изменяющейся в разных версиях GNOME. – bartonjs
Благодарим за помощь. На самом деле я не хотел так поступать с дополнительной библиотекой. Но я думаю, что это лучший способ, и я не знаю другого способа получить эти ценности. Если вы добавите этот комментарий к своему ответу, я приму его. :) – bittnerd