如何将数据从托管程序集流式传输到本机库并再次返回?
如何将数据(文本)从托管程序集流式传输到本机库并将数据(文本)流式传输回托管程序集?
具体来说,我想在.NET端公开某种类型的System.IO.Stream
,并且( 最重要的是 )在本机端公开一个FILE *
。
本机方法的签名应该是:
FILE * foo(FILE * bar);
本机p / invoke调用的包装签名应该是:
CustomStream foo(CustomStream bar);
我不想在本机端使用回调方法 (一个用于获取更多数据,一个用于设置更多数据)。 我想在本机端使用FILE *
– 以及对其进行操作的所有相关方法,例如fprintf
。
我不想要任何磁盘I / O. 这需要是内存中的操作。
我完全控制托管程序集和本机库。
该解决方案必须与.NET 2.0一起使用
我愿意创建任何类型的托管或非托管填充层来实现这一目标。
“显而易见”的解决方案是使用STDIN
和STDOUT
并启动子进程 – 但是我不想要一个单独的进程。 此外,我尝试重定向本机库的STDIN
和STDOUT
流,而这些流不是Windows上的控制台应用程序,但它的失败程度有些惊人(并且有很多头脑冲击)。
基于这个问题: 在C#Windows服务上重定向stdout + stderr我试图修改方法(至少)解决问题的一半“响应”流 – 但是没有FileStream
(因为我想要一些类似于MemoryStream
东西) )。 但是, FileStream
是唯一公开合适的低级流句柄的流类型。
否则,我已经陷入困境,而且我现在正在考虑我需要深入研究并提出我自己的手动本地托管流实现,但实际上并不知道从哪里开始。
解
最后!
我在这里发布了一个完整的示例项目:
http://pastebin.com/jcjHdnwz
这适用于.NET 3.5并使用AnonymousPipeServerStream
– 但是通过一些reflection器,很容易复制.NET 2.0中AnonymousPipeServerStream
的内部工作方式。
感谢您的帮助shf301指向我的原生管道API,让我查看Microsoft文档以更好地了解正在发生的事情,并指出我需要使用_open_osfhandle
方法来获取FILE *
参考。
您应该能够使用.NET 3.5或更高版本中的AnonymousPipeStream执行此操作。 这会通过您可以传递给SetStdHandle
的SafePipeHandle
属性公开句柄。
对于.NET 2.0,您可能必须P / Invoke到非托管管道API。