从 CLI 包装器检索本机对象



我有一些相互交互的本机对象。
现在,我将其中一些对象包装到托管类中。但在某些情况下,我必须检索本机包装的对象。

例如,采用以下对象:

这是一个创建会话对象的本机类。

private class SessionFactory : public ISessionFactory {
  public:
    ~SessionFactory() {};
    SessionFactory(MessageEventHandler* handler) : m_handler(handler) {};
    /// Creates an instance of a Session,
    /// using the given message handler.
    inline Session* createSession(const IMessageDispatcher* dispatcher) {
      Session* s = new Session(dispatcher);
      s->AddMsgHandler( m_handler );
      return s;
    };
  private:
    MessageEventHandler* m_handler;
};

这是一个包装本机 MessageEventHandler 对象的托管类。

public ref class NetMessageEventHandler {
  public:      
    NetMessageEventHandler() {
      m_NativeHandlerPtr = new MessageEventHandler();
    }
    const MessageEventHandler* GetNativeObject() const;
  private:
    MessageEventHandler* m_NativeHandlerPtr;
};

现在,进入下面的NetMessageDispatcher,我必须与前面的每一个进行交互:

public ref class NetMessageDispatcher {
  public:
    NetMessageDispatcher(MessageEventHandler^ handler) {
      m_Dispatcher = new MessageDispatcher( new SessionFactory(handler->GetNativeObject()) );
    }
  private:
    MessageDispatcher* m_Dispatcher;
}

这种方法是否正确,或者还有其他一些最佳实践?

基本原则是可以的:如果你需要原生对象,你必须公开它,就这么简单。像您一样返回它没有问题,毕竟 C++\CLI 旨在使这样的事情成为可能。

最终,您可以将创建 MessageDispatcher 的责任从托管的 NetMessageDispatcher 中移出:NetMessageDispatcher 知道需要知道如何从 MessageEventHandler 创建 MessageDispatcher,因此这是一个不必要的额外依赖项。最好直接在构造函数中向它传递一个 MessageDispatcher。

还要注意不要在这里引入内存泄漏,您有很多新的但没有删除。例如,检查这一点并在本机类中使用标准智能指针。

最新更新