c++ - 包装在 C++/CLI 中使用 native 接口(interface)的 native C++ 代码

标签 c++ c++-cli clr

我目前一直在尝试包装使用如下定义的 native C++ 接口(interface)的 native C++ API 的一部分:

#pragma once

class BufferReaderInterface
{
public:
    virtual ~BufferReaderInterface()
    {
    }

    const static int BUFFER_SIZE = 100;
    virtual void ReadNextBuffer(char* buffer) = 0;
};

然后解析器类使用它来将数据读入它的本地缓冲区,以便以后像这样进行解析:

#pragma once

#include "BufferReaderInterface.h"

class BufferParser
{
public:
    void ReadNextBuffer(BufferReaderInterface& reader)
    {
        reader.ReadNextBuffer(localBuffer);
    }

    void ParseBuffer()
    {
        // do buffer parsing after ReadNextBuffer()...
    }
private:
    char localBuffer[BufferReaderInterface::BUFFER_SIZE];
};

这是一个从文件流中读取缓冲区的示例实现(它不一定是文件流,也可以实现为从网络读取):

#pragma once

#include <fstream>

#include "BufferReaderInterface.h"

class FileStreamBufferReader : public BufferReaderInterface
{
public:
    FileStreamBufferReader(std::string filename)
    {
        bufferFile.open(filename.c_str(), 
                        std::ios_base::in | std::ios_base::binary);
        if(!bufferFile)
        {
            throw std::invalid_argument(filename);
        }
    }

    ~FileStreamBufferReader()
    {
        bufferFile.close();
    }

    void ReadNextBuffer(char* buffer)
    {
        bufferFile.read((char *)buffer, BUFFER_SIZE);
    }

private:
    std::ifstream bufferFile;
};

一个简单的用法如下:

BufferReaderInterface* br = new FileStreamBufferReader("test.binary");

BufferParser parser;
parser.ReadNextBuffer(*br);
parser.ParseBuffer();

// use parsed data...

delete br;

我应该如何包装 BufferParser 类?我正在尝试在其上使用 Pimpl-idiom,但在正确实现 ReadNextBuffer(BufferReaderInterface&) 函数的托管版本时我遇到了困难。我已经尝试创建一个 public interface class ManagedBufferReaderInterface,但后来我卡住了,因为 BufferParser 采用 native C++ 接口(interface),而 C++/CLI 类无法实现 native C++ 接口(interface),如 BufferReaderInterface。有人遇到过这个吗?

如有任何建议,我们将不胜感激!

最佳答案

使用抽象类而不是接口(interface)怎么样?

public ref class ManagedBufferReaderInterface abstract
{
private public: // internal 
  BufferReaderInterface * native_interface;

public:
  ManagedBufferReaderInterface(BufferReaderInterface * nativeinterface)
    : native_interface(nativeinterface) 
  { ... }

  //...

};


public ref class ManagedBufferParser
{
  BufferParser * parser;
public:
  ManagedBufferParser()
   : parser(new BufferParser()) 
  { ... }

  void ReadNextBuffer(ManagedBufferReaderInterface ^ reader)
  {
    parser->ReadNextBuffer(reader->native_interface);
  }

  void ParseBuffer()
  {
    parser->ParseBuffer();
  }

//...
};

添加代码:

#include <msclr\marshal_cppstd.h>

public ref class ManagedFileStreamBufferReader : public ManagedBufferReaderInterface
{

public:
  ManagedFileStreamBufferReader(System::String ^ filename)
    : ManagedBufferReaderInterface(new FileStreamBufferReader( msclr::interop::marshal_as<std::string>(filename) ) )
    { ... }

  // ....
};

//Example

ManagedBufferReaderInterface ^ br = gcnew ManagedFileStreamBufferReader("test.binary");

ManagedBufferParser ^ parser = gcnew ManagedBufferParser();
parser->ReadNextBuffer(br);
parser->ParseBuffer();

关于c++ - 包装在 C++/CLI 中使用 native 接口(interface)的 native C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100045/

相关文章:

.net - C++ 原生与 C++/Cli 性能对比(针对 OpenCV 项目)

interface - C++/CLI 接口(interface)中的 Getter only 属性

c++ - 在 .net c++ 中使用 XmlDocument 编写 XML

c# - 获取 C# 应用程序在非开发机器上崩溃的堆栈跟踪

c# - 我如何充分了解 CLR 以对性能问题做出有根据的猜测?

c# - 多线程 - 等待所有线程收到信号

c++ - 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU?

c++ - 分配类型为自己类 C++ 的 vector 的内存

c++ - 解决链表问题时是否创建额外的节点是一个好习惯?

c++ - DISPID_VALUE 对于从脚本调用 IDispatch 是否可靠?