如何将数据从托管程序集传输到本机库并再传输回来?

本文关键字:传输 本机 回来 程序集 数据 | 更新日期: 2023-09-27 18:18:08

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

具体来说,我想在。net端公开一个System.IO.Stream,并且(最重要的是)在本机端公开一个FILE *

本机方法的签名应该是:

FILE * foo(FILE * bar);

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

CustomStream foo(CustomStream bar);

我不想在本机端使用回调方法(一个用于获取更多数据,一个用于设置更多数据)。我想在本机端使用FILE * - 和所有相关的操作方法,如fprintf

我不想要任何磁盘I/O。这需要是一个内存操作。

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

解决方案必须与。net 2.0兼容

我愿意创建任何类型的管理或非管理垫片层需要完成这一点。

"显而易见"的解决方案是使用STDINSTDOUT并启动子进程-但是我不想要一个单独的进程。此外,我尝试重定向一个本机库的STDINSTDOUT流,它不是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。