Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据从托管程序集流式传输到本机库,然后再流式传输回来?_C#_.net_Stream_Pinvoke_Stdout - Fatal编程技术网

C# 如何将数据从托管程序集流式传输到本机库,然后再流式传输回来?

C# 如何将数据从托管程序集流式传输到本机库,然后再流式传输回来?,c#,.net,stream,pinvoke,stdout,C#,.net,Stream,Pinvoke,Stdout,如何将数据(文本)从托管程序集流式传输到本机库,并将数据(文本)流式传输回托管程序集 具体来说,我想在.NET端公开某种类型的System.IO.Stream,在本机端公开(最重要的)一个文件* 本机方法的签名应为: 文件*foo(文件*bar) 本机p/invoke调用周围包装的签名应为: CustomStream-foo(CustomStream-bar) 我不想在本机端使用回调方法(一个用于获取更多数据,另一个用于设置更多数据)。我想在本机端使用一个文件*,以及对其进行操作的所有相关方法,

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

具体来说,我想在.NET端公开某种类型的
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#的命名管道包装器类。这应该是可行的。请参阅我的编辑,它说明了我为此所做的尝试以及我失败的地方。你引导我找到了解决方案,我现在已经开始工作了。。。给我一点时间把它打包并寄出去。我相信你。