c++ /CLI:如何在本机类中存储托管引用

C++/CLI: how to store a managed reference inside a native class?

本文关键字:存储 引用 本机 CLI c++      更新时间:2023-10-16

在我的混合解决方案(c++/. net)中,我想将Log4Net的ILog实例传递给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
};

使用gcroot<ILog^>成员,如下所述。