C# 如何将数据从托管程序集流式传输到本机库,然后再流式传输回来?
如何将数据(文本)从托管程序集流式传输到本机库,并将数据(文本)流式传输回托管程序集 具体来说,我想在.NET端公开某种类型的C# 如何将数据从托管程序集流式传输到本机库,然后再流式传输回来?,c#,.net,stream,pinvoke,stdout,C#,.net,Stream,Pinvoke,Stdout,如何将数据(文本)从托管程序集流式传输到本机库,并将数据(文本)流式传输回托管程序集 具体来说,我想在.NET端公开某种类型的System.IO.Stream,在本机端公开(最重要的)一个文件* 本机方法的签名应为: 文件*foo(文件*bar) 本机p/invoke调用周围包装的签名应为: CustomStream-foo(CustomStream-bar) 我不想在本机端使用回调方法(一个用于获取更多数据,另一个用于设置更多数据)。我想在本机端使用一个文件*,以及对其进行操作的所有相关方法,
System.IO.Stream
,在本机端公开(最重要的)一个文件*
本机方法的签名应为:
文件*foo(文件*bar)代码>
本机p/invoke调用周围包装的签名应为:
CustomStream-foo(CustomStream-bar)代码>
我不想在本机端使用回调方法(一个用于获取更多数据,另一个用于设置更多数据)。我想在本机端使用一个文件*
,以及对其进行操作的所有相关方法,如fprintf
我不需要任何磁盘I/O。这需要在内存中进行操作
我可以完全控制托管程序集和本机库
该解决方案必须与.NET 2.0配合使用
我愿意创建实现此功能所需的任何类型的托管或非托管垫片层
“显而易见”的解决方案是使用STDIN
和STDOUT
并启动一个子进程-但是我不想要单独的进程。此外,我尝试重定向本机库的STDIN
和STDOUT
流,而本机库不是Windows上的控制台应用程序,但失败得有点惊人(而且令人头痛)
基于这个问题:
我试图修改方法(至少)解决我问题的一半“响应”流-但没有文件流
(因为我想要更类似于内存流
)。但是,FileStream
是唯一公开合适的低级流句柄的流类型
否则,我会陷入困境,目前我认为我需要深入研究,并提出自己的手动nativemanaged stream实现,但我真的不知道从哪里开始
解决方案
终于
我在这里发布了一个完整的示例项目:
这是针对.NET 3.5的,它使用了匿名PipeServerStream
——但只要稍微加上一点反射器,就很容易在.NET 2.0中复制匿名PipeServerStream
的内部工作
感谢您的帮助shf301为我指明了本机管道API,这让我查阅了Microsoft文档,以便更好地了解正在发生的事情,为了指出这一点,我需要使用\u open\u osfhandle
方法来获取文件*
引用。您应该能够使用.NET 3.5或更高版本来实现这一点。它通过可传递到setstdhold
的SafePipeHandle
属性公开句柄
对于.NET 2.0,您可能需要p/调用非托管管道API。只需将文件流
替换为内存流
?这里重要的是流被包装在一个StreamWriter
中,该writer作为新的标准输出和错误流传入。是的,需要一个管道来获得一个可写句柄。净3。5@JeffMercado,Win32函数SetStdHandle
AFAIK需要一个合适管道的句柄,而MemoryStream
不提供这一点,而FileStream
通过.SafeFileHandle.DangerousGetHandle()
@Steve:Ah ok,我不知道有什么不同,我自己也没有试过。在本机端,FILE*
是绝对的要求吗?我已经增加了250分的悬赏。您是否可以扩展对“非托管管道API”的引用?@Steve-我的意思是使用P/Invoke调用非托管CreatePipe
函数来创建管道,并使用ReadFile
从管道中读取。请参阅Msdn和pinvoke.net@Steve还有一个C#的命名管道包装器类。这应该是可行的。请参阅我的编辑,它说明了我为此所做的尝试以及我失败的地方。你引导我找到了解决方案,我现在已经开始工作了。。。给我一点时间把它打包并寄出去。我相信你。