.net — C ++ / CLI: как сохранить управляемую ссылку внутри собственного класса?

В моем смешанном решении (C ++ /. NET) я хотел бы передать экземпляры ILog Log4Net объектам C ++ (чтобы объединить ведение журнала в решении).

Я подумал написать интерфейс C ++ (LogInterface), а затем внедрить управляемый адаптер в проект C ++ / CLI, но проблема в том, что неуправляемый адаптер не сможет сохранить поле, указывающее на управляемый ILog пример.

Существует ли элегантный, безопасный и эффективный способ для достижения этой цели (кроме хранения управляемой ссылки в статическом кэше)?

class UnmanagedLogAdapter :
public LogInterface
{
public:
UnmanagedLogAdapter(log4net::ILog^ log);

virtual bool IsInfoEnabled(void) const override
{
return m_log->IsInfoEnabled();
}

virtual void Info(const std::wstring& message) override
{
log4net::ILog^ log = m_log; // alternative that I want to avoid: log = StaticCache::Find(m_logId);
log->Info(gcnew System::String(message.cstr()));
}

private:
log4net::ILog^ m_log; //TODO: a managed field is forbidden
};

2

Решение

Использовать gcroot<ILog^> член, как описано Вот.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]