【问题标题】:C++/CLI: how to store a managed reference inside a native class?C++/CLI:如何在本地类中存储托管引用?
【发布时间】:2013-04-11 02:17:13
【问题描述】:

在我的混合解决方案 (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
};

【问题讨论】:

  • 我意识到已经过了 7 年,但我发现自己认为我现在需要做同样的事情。你最终这样做了吗?如果有,效果如何?

标签: c++ .net logging c++-cli log4net


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多