Макрос os_log
В отличие от функции os_log_create, os_log является макросом, как уже упоминалось в комментариях.
Так что если вы напишите на C:
os_log(log, "%{public}s", "Test!");
Наконец, она вызовет функцию с именем _os_log_impl, но первым параметром этого будет указатель __dso_handle, к которому у нас нет доступа с управляемой стороны.
Возможное решение
Но вам не нужно обходиться без новой системы регистрации от Apple.Одной из возможностей является создание динамической библиотеки, которая предоставляет определенный API, который можно легко вызывать из управляемого кода C #.
Как создать динамическую библиотеку в XCode
Создать динамическую библиотеку в XCode легко:
Минимальный пример
Минимальный пример .c для нашей собственной библиотеки Logging может выглядеть следующим образом:
#include <os/log.h>
extern void Log(os_log_t log, char *message) {
os_log(log, "%{public}s", message);
}
Вызов из .Net
Я взял ваш источник и только слегка его изменил:
using System;
using System.Runtime.InteropServices;
namespace Foo
{
class Program
{
[DllImport("System", EntryPoint = "os_log_create")]
private static extern IntPtr os_log_create(string subsystem, string category);
[DllImport("Logging", EntryPoint = "Log")]
private static extern void Log(IntPtr log, string msg);
static void Main(string[] args)
{
IntPtr log = os_log_create("some.bundle.id", "SomeCategory");
Log(log, "Test!");
}
}
}
Динамическая библиотека, созданная с помощью Xcode, имеетимя Ведение журнала .Наша созданная в C функция ведения журнала называется здесь Log .
Конечно, вы можете разработать API так удобно, как вам хочется, это должен быть минимальный пример, который максимально приближен к вопросу.возможный.
Вывод в консольной утилите
Вывод в консольной утилите (если вы фильтруете для some.bundle.id ) будет выглядеть следующим образом: