C# · 12月 30, 2021

c# – 如何将数据从托管程序集流传输到本地库并重新启动?

如何将数据(文本)从托管程序集传输到本机库,并将数据(文本)流传输到托管程序集?

具体来说,我想在.NET端暴露一些Sy@R_403_2354@.IO.Stream,而最重要的是在本地公开一个FILE *.

本机方法的签名应为:

FILE * foo(FILE * bar);

本机p / invoke调用周围的包装器的签名应该是:

CustomStream foo(CustomStream bar);

我不想在本地使用回调方法(一个用于获取更多数据,另一个用于设置更多数据).我想在本地使用一个FILE *,以及所有与它相关的方法,如fprintf.

我不想要任何磁盘I / O.这需要是内存中的操作.

我完全控制了托管程序集和本机库.

该解决方案必须与.NET 2.0一起使用

我愿意创建任何一种管理或非托管的垫片层来拉出这个.

“明显”的解决方案是使用STDIN和STDOUT并启动一个子进程 – 但是我不想要单独的进程.此外,我尝试将不是Windows上的控制台应用程序的本机库的STDIN和STDOUT流重定向至少有些惊人(而且有很大的冲击).

基于这个问题:
Redirect stdout+stderr on a C# Windows service我尝试修改(至少)解决方案(至少)解决我的问题的一半我的问题 – 但没有一个FileStream(因为我想要一些更类似于一个MemoryStream).然而,FileStream是暴露适当的低级流句柄的唯一流类型.

否则,我很困难,目前我认为我需要更深入地深入了解自己的手工滚动的本机管理流实现,但是并不知道从哪里开始.

最后!

我在这里发布了一个完整的示例项目:

http://pastebin.com/jcjHdnwz

这是针对.NET 3.5,并使用AnonymousPipeServerStream – 但是有一点反射镜,它足够复制.NET 2.0中AnonymousPipeServerStream的内部工作.

感谢您的帮助shf301指向我的本机管道API,这让我查看Microsoft文档以更好地了解发生了什么,并指出我需要使用_open_osfhandle方法来获取FILE *引用.

解决方法 您应该可以使用.NET 3.5或更高版本中的 AnonymousPipeStream来执行此操作.通过您可以传递给SetStdHandle的SafePipeHandle属性来显示一个句柄.

对于.NET 2.0,您可能需要P / Invoke到非托管管道API.