【问题标题】:Is it possible to wrap a .net Stream as an stl std::ostream*?是否可以将 .net Stream 包装为 stl std::ostream*?
【发布时间】:2009-09-23 17:38:45
【问题描述】:

我有一个将文本输出到 std::ostream* 的非托管 c++ 库。

我从一个 c# 库使用的托管 c++ 包装器中调用它。

目前我将非托管代码传递一个指向 std::stringstream 的指针,然后调用 System.String(stringstream.str().c_str()) 将我的非托管缓冲区复制回 .net 友好字符串。

是否可以将 .net 流包装为 stl std::ostream*? - 允许我将文本直接从非托管代码流式传输到托管 STREAM 实现。

【问题讨论】:

    标签: c# .net c++ stream


    【解决方案1】:

    如果我理解正确,您想用 C++ 标准流包装 .NET 流,以便您的本机代码流入 C++ 标准流,但数据最终在 .NET 流中。

    C++ IO 流大致分为流本身,它们执行 C++ 类型和二进制表示之间的所有转换,以及流缓冲区,它缓冲数据并从设备读取/写入设备。为了实现您的目标,您需要做的是使用写入 .NET 流的流缓冲区。为此,您需要创建自己的流缓冲区,从 std::stream_buffer 派生,它在内部引用 .NET 流并将所有数据转发给它。您将其传递给std::ostream 对象,该对象将传递给本机代码。

    编写自己的流缓冲区不是初学者的任务,但也不是特别难。选择关于 C++ IO 流的任何体面的参考资料(Langer/Kreft 是你在纸上能得到的最好的参考资料),找出你需要覆盖哪些虚函数才能做到这一点,你就完成了。

    【讨论】:

    • 谢谢 - 这是有道理的 - 我错过了流缓冲区拆分。
    【解决方案2】:

    你可以这样做。只需创建一个派生自 Stream 的自定义类,并实现适当的方法。

    在这种情况下,您需要将CanRead 设置为true,并至少实现ReadReadByte。当您执行它们时,只需从本机端的输出流中读取即可。

    这将允许您将数据从本机 ostream“流式传输”到 .NET 流,并且可以与 .NET 中的任何流读取器类一起使用。

    【讨论】:

    • 我认为他需要它反过来 - 所以它会是一个自定义类,从 std::ostream 派生并包装 System.IO.Stream
    • 不是 100% 确定,当我读到它时。无论哪种方式,将数据从 .NET 流传递到本机流都相当容易,无论是哪个方向。
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2015-11-01
    • 2011-09-11
    相关资源
    最近更新 更多