通过CLI将fstream(或等效的)从C#传递到C ++

如何将C#中的fstream或等效项通过CLI传递给非托管C ++ DLL?

粗略的应用大纲:

  • C#应用程序从数据库中读取二进制文件
  • 非托管C ++ dll用于“解码”此文件并返回其中包含的信息
  • 我可以修改任何C#代码。 CLI包装器是我可以修改的C ++端的唯一部分。

我目前正在将二进制文件保存到磁盘并将其路径传递给CLI包装器,在那里它作为fstream打开。 这适用于测试目的,但由于显而易见的原因不适用于生产。

我还研究了将一个字节数组传递给DLL,但我无法找到将其转换为除了GlobalAlloc以外的其他fstream的方法,我不想使用它。

任何帮助或想法将不胜感激。

谢谢。

您可以将托管二进制数组传递给C ++ / CLI DLL。 固定arrays。 然后可以将其转换为STL字符串对象。 然后,您可以将STL字符串传递给STL stringstream对象,该对象inheritance自iostream。 将stringstream视为.NET MemoryBuffer对象。 将stringstream传递给您的非托管C ++。 这可能在<10行代码中完成。 缺点是数据将被复制到内存中,这是低效的。 对于许多应用程序,我怀疑这将是一个问题。

或者,您可以编写自己的类inheritance自包装.NET流对象的stream_buffer。 (更好的是inheritance这个而不是iostream,正如其他人提出的那样)。 这将是最有效的方式,因为没有不必要的复制内存,但如果第一种方法足够快,我就不会去做。

如果您的C ++ DLL接受通用的iostream对象(而不仅仅是fstreams),请创建一个包装System.IO流并将其传递给DLL的iostream实现。 然后,非托管端可以直接使用托管流。

您的C ++ / CLI层可以为C#端公开一个简单的接口,可能会传入字节数组对象以流式传输到流库中。

基本上是句柄/主体惯用语,其中C ++ / CLI层包装流并将不透明句柄传递回C#以供使用。

创建一个临时文件。 让操作系统为你分配一个临时名称来解决多个应用程序(linux可以做到这一点,我希望windows可以)。
临时文件可用于业务应用程序中的多工具链,并用于解决您的问题。 如果文件不是太大,它们将保留在缓存中,如果你关闭并快速删除它们,它们甚至不会被写入磁盘。