如何将数据(文本)从托管程序集流式传输到本机库并将数据(文本)流回托管程序集?
具体来说,我想揭露一个System.IO.Stream
.NET 端的某种类型,并且(最重要的是) a FILE *
在本机方面。
本机方法的签名应该是:
FILE * foo(FILE * bar);
围绕本机 p/invoke 调用的包装器的签名应该是:
CustomStream foo(CustomStream bar);
我不想在本机端使用回调方法(一种用于获取更多数据,一种用于设置更多数据)。我想用一个FILE *
在本机方面 -以及对其进行操作的所有相关方法例如fprintf
.
我不需要任何磁盘 I/O。这需要是内存中操作。
我可以完全控制托管程序集和本机库。
该解决方案必须适用于 .NET 2.0
我愿意创建实现这一目标所需的任何类型的托管或非托管填充层。
“明显”的解决方案是使用STDIN
and STDOUT
并启动一个子进程 - 但我不想要一个单独的进程。另外,我尝试重定向STDIN
and STDOUT
不是 Windows 上的控制台应用程序的本机库的流已经失败得有些惊人(并且令人头疼)。
基于这个问题:在 C# Windows 服务上重定向 stdout+stderr https://stackoverflow.com/questions/1579074/redirect-stdoutstderr-on-a-c-sharp-windows-service我尝试修改方法来(至少)解决我的问题的“响应”流一半 - 但没有FileStream
(因为我想要一些更类似于MemoryStream
)。然而,FileStream
是唯一公开合适的低级流句柄的流类型。
否则,我会陷入困境,目前我认为我需要更深入地研究并提出我自己的手动本地托管流实现,但真的不知道从哪里开始。
Solution
最后!
我在这里发布了一个完整的示例项目:
http://pastebin.com/jcjHdnwz http://pastebin.com/jcjHdnwz
这是针对 .NET 3.5 并使用AnonymousPipeServerStream
- 但是通过一点点反射,就很容易复制其内部工作原理AnonymousPipeServerStream
在.NET 2.0 中。
感谢您的帮助shf301他向我指出了原生管道 API,这让我查阅了 Microsoft 文档以更好地了解正在发生的事情,并指出我需要使用_open_osfhandle
方法得到FILE *
参考。