如何将数据(文本)从托管程序集流式传输到本机库并将数据(文本)流式传输回托管程序集?
具体来说,我想System.IO.Stream在.NET端公开某种类型,并且(最重要的是)FILE *在本机方面.
本机方法的签名应该是:
FILE * foo(FILE * bar);
本机p/invoke调用的包装签名应该是:
CustomStream foo(CustomStream bar);
我不想在本机端使用回调方法(一个用于获取更多数据,一个用于设置更多数据).我想FILE *在本机端使用a - 以及所有相关的方法,例如fprintf.
我不想要任何磁盘I/O. 这需要是内存中的操作.
我完全控制托管程序集和本机库.
该解决方案必须与.NET 2.0一起使用
我愿意创建任何类型的托管或非托管填充层,以实现此目的.
"明显的"解决方案是使用STDIN和STDOUT启动子进程 - 但是我不想要一个单独的进程.此外,我试图重定向STDIN和STDOUT这不是在Windows控制台应用程序本机库的数据流都失败了几分壮观(以及很多头撞).
基于这个问题:
在C#Windows服务上重定向stdout + stderr我试图修改方法(至少)解决问题的一半"响应"流 - 但是没有FileStream(因为我想要更类似的东西MemoryStream).但是,FileStream是唯一一种公开合适的低级流句柄的流类型.
否则,我已经陷入困境,我现在正在考虑我需要深入研究并提出我自己的手动本地< - >托管流实现,但实际上并不知道从哪里开始.
最后!
我在这里发布了一个完整的示例项目:
这适用于.NET 3.5并使用AnonymousPipeServerStream- 但是只需要一点点反射器,就可以很容易地复制AnonymousPipeServerStream.NET 2.0中的内部工作方式.
感谢您的帮助shf301指向我的原生管道API,让我查看Microsoft文档以更好地了解正在发生的事情,并指出我需要使用该_open_osfhandle方法来获取FILE …
我有一个非托管的 DLL,它正在将日志消息写入标准输出。我正在使用来自 WPF 应用程序的 P 调用调用此 DLL,我需要获取标准输出流日志。我试过 Console.SetOut,但这似乎只能捕获使用 Console.Write 等编写的信息。
谁有想法?我在其他地方发现了类似的问题,但他们没有答案。