gpt4 book ai didi

c# - 如何将数据从托管程序集流式传输到 native 库并再次返回?

转载 作者:可可西里 更新时间:2023-11-01 09:07:39 26 4
gpt4 key购买 nike

如何将数据(文本)从托管程序集流式传输到 native 库,然后将数据(文本)流式传输回托管程序集?

具体来说,我想在 .NET 端公开某种类型的 System.IO.Stream,以及(最重要的)FILE * 在 native 端。

本地方法的签名应该是:

FILE * foo(FILE * bar);

围绕原生 p/invoke 调用的包装器的签名应该是:

CustomStream foo(CustomStream bar);

我不想在 native 端使用回调方法(一种用于获取更多数据,一种用于设置更多数据)。我想在 native 端使用 FILE * - 以及对其进行操作的所有相关方法,例如 fprintf

我不想要任何磁盘 I/O。这需要在内存中进行操作。

我可以完全控制托管程序集和 native 库。

该解决方案必须适用于 .NET 2.0

我愿意创建实现此目的所需的任何类型的托管或非托管填充层。

“显而易见”的解决方案是使用 STDINSTDOUT 并启动一个子进程 - 但是我不想要一个单独的进程。此外,我尝试重定向 native 库的 STDINSTDOUT 流,这不是 Windows 上的控制台应用程序,但失败得有些惊人(并且有很多头撞) .

基于这个问题: Redirect stdout+stderr on a C# Windows service我试图修改方法以(至少)解决我问题的一半“响应”流 - 但没有 FileStream (因为我想要更类似于 MemoryStream 的东西).但是,FileStream 是唯一公开合适的低级流句柄的流类型。

否则,我会陷入困境,目前认为我需要更深入地研究并想出我自己的手动 native <->托管流实现,但真的不知道从哪里开始。


解决方案

终于!

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

http://pastebin.com/jcjHdnwz

这是针对 .NET 3.5 并使用 AnonymousPipeServerStream - 但通过一些反射器,很容易复制 AnonymousPipeServerStream 的内部工作.NET 2.0。

感谢您的帮助 shf301 将我指向 native 管道 API,这让我查看了 Microsoft 文档以更好地了解正在发生的事情,并指出我需要使用_open_osfhandle 方法获取FILE * 引用。

最佳答案

你应该能够使用 AnonymousPipeStream 来做到这一点在 .NET 3.5 或更高版本中。这会通过 SafePipeHandle 属性公开一个句柄,您可以将该句柄传递给 SetStdHandle

对于 .NET 2.0,您可能必须 P/调用非托管管道 API。

关于c# - 如何将数据从托管程序集流式传输到 native 库并再次返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com