如何将数据(文本)从托管程序集流到本机库并将数据(文本)流回托管程序集?
具体来说,我想在。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
-但有一点反射器,很容易复制AnonymousPipeServerStream
的内部工作在。net 2.0。
感谢您的帮助shf301为我指出了本机管道API,这让我查看微软文档以便更好地了解正在发生的事情,并指出我需要使用_open_osfhandle
方法来获得FILE *
引用。
你应该能够在。net 3.5或更高版本中使用AnonymousPipeStream来实现这一点。这暴露了一个句柄,通过SafePipeHandle
属性,你可以传递给SetStdHandle
。
对于。net 2.0,您可能必须p/Invoke到非托管管道API。