4

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

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

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

4

1 回答 1

1

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

另一种选择是由 CreateMailSlot API 创建并通过 "\\.\mailslot" 命名空间操作的邮件槽。主要区别是在数据报级别上操作,而不是像管道那样在流上操作。

于 2012-12-23T02:43:47.887 回答