Log4net, отправка сообщений журнала из dll C++ в приложение aC#?

У меня есть приложение WPF / C#, которое использует Log4Net для ведения журнала. Это приложение вызывает несколько библиотек C++, используя:

[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void TestFunction();

Я хотел бы, чтобы dll отправлял сообщения о регистрации обратно в приложение C#, чтобы все, начиная с C++ и C#, попадало в один и тот же журнал. Это возможно?

Если так, как я могу пойти об этом?

1 ответ

Пример, который перенаправляет журналы в c++ dill на обратный вызов c#:

С# сторона:

      [UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void LogCallback([MarshalAs(UnmanagedType.LPWStr)] string info);

namespace WinApp
{
  static class Wrapper
  {
    [DllImport("target.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    public static extern void SetLogCallback([MarshalAs(UnmanagedType.FunctionPtr)] LogCallback callbackPointer);

    internal static void Init()
    {
      LogCallback log_cb = (info) =>
      {
        Console.Write(DateTime.Now.TimeOfDay.ToString() + " " + info);
      };
      SetLogCallback(log_cb);
    }
  }

Сторона С++ (скомпилированная в target.dll):

      extern "C" {
    typedef char* (__stdcall* LogCallback)(const wchar_t* info);
    PEPARSER_API void SetLogCallback(LogCallback cb);
}

static LogCallback global_log_cb = nullptr;


void LogInfo(const wchar_t* info) {
    if (global_log_cb) {
        std::wstring buf = L"[PEParse]" + std::wstring(info) + L"\n";
        global_log_cb(buf.c_str());
    }
    else {
        std::cout << "global_log_cb not set\n";
    }
}

void LogInfo(const char* info) {
    const size_t cSize = strlen(info) + 1;

    size_t t;

    std::wstring wstr(cSize, L'#');
    mbstowcs_s(&t, &wstr[0], cSize, info, cSize - 1);

    LogInfo(&wstr[0]);
}

void SetLogCallback(LogCallback cb) {
    global_log_cb = cb;
    LogInfo("log init");
}

Я давно пользуюсь этим интерфейсом.

Другие вопросы по тегам