从C#调用FILE *的C DLL - 传入和传出流

时间:2012-12-14 08:39:30

标签: c# c stream pinvoke bytearray

我在使用C#代码调用C DLL函数时遇到问题。 C DLL具有接受文件名(const char *)的函数,然后打开文件,对内容执行一些工作(通过FILE *读取)并将结果写入另一个文件。我想优化它,以便不执行磁盘读/写操作,因为我已经在C#应用程序的内存流中处理了文件。我有自由修改两端(C#app和C DLL)。 C#app基于.NET 2.0。

我想扩展DLL,以便它有一个接受并吐出字节数组的函数,这样我就可以轻松地PInvoke它。输出部分在C端看起来很容易 - 而不是写入FILE *我只能将连续的字节保存到数组 - 但输入似乎很难。我不知道如何处理C端与获得的字节数组,使其成为一个内存流,而是从这一点开始在物理文件流上工作(我不想重写整个DLL来读取从字节数组而不是FILE * - 我希望大多数DLL内部保持不变,只是为了包装和调整输入/输出)。但实际上我不知道,也许有更好的主意去做。

所以问题是:如何将C中的字节数组转换为(FILE *)而不将其实际写入磁盘并打开FILE *来读取此文件? 或者:如何将内存流从C#传递到PInvoke到C DLL,以便在C端轻松识别并作为FILE *使用(再次,没有物理磁盘写/读,只在内存中??

1 个答案:

答案 0 :(得分:1)

Windows中的命名管道通过内存缓冲区处理,并与大多数文件API兼容。要操作管道,请使用“\\。\ pipe”命名空间,例如名称如“\\。\ pipe \ foo”。要创建管道,请使用CreateNamedPipe Win32 API。使用fopen在C端打开它。

另一个替代方案可能是由CreateMailSlot API创建的邮件槽,并通过“\\。\ mailslot”命名空间进行操作。主要区别在于数据报级别而不是流式操作。