我在使用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 *
使用(再次,没有物理磁盘写/读,只在内存中??
答案 0 :(得分:1)
Windows中的命名管道通过内存缓冲区处理,并与大多数文件API兼容。要操作管道,请使用“\\。\ pipe”命名空间,例如名称如“\\。\ pipe \ foo”。要创建管道,请使用CreateNamedPipe Win32 API。使用fopen在C端打开它。
另一个替代方案可能是由CreateMailSlot API创建的邮件槽,并通过“\\。\ mailslot”命名空间进行操作。主要区别在于数据报级别而不是流式操作。