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

标签 c# c stream pinvoke bytearray

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

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

所以问题是:如何将 C 中的字节数组转换为 (FILE *) 而无需将其实际写入磁盘并打开 FILE * 读取这个文件? 替代方法:如何通过 PInvoke 将内存流从 C# 传递到 C DLL,以便它可以在 C 端轻松识别并作为 FILE 使用*(同样,没有物理磁盘写入/读取,仅在内存中)?

最佳答案

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

另一种选择可能是由 CreateMailSlot API 创建并通过“\\.\mailslot”命名空间操作的邮槽。主要区别在于数据报级别的操作,而不是管道情况下的流操作。

关于c# - C DLL 处理从 C# 调用的 FILE * - 传入和传出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13875165/

相关文章:

c - 如何在C中正确返回字符串

c - 在 C 中传递结构的正确方法

java - 通过网络发送文件时如何指定文件结尾

C#读取unicode?

c# - 单击搜索按钮时出现错误

c# - WPF格式显示的文字?

c# - 在 visual studio 中进行 xamarin 更新后,使用 Android 5.1.1 Lollipop 启动应用程序时应用程序启动崩溃

c# - 基于选项卡的启用

c - 用户输入以创建链接列表

c++ - 将文件流重定向到内存流