相关疑难解决方法(0)

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

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

具体来说,我想System.IO.Stream在.NET端公开某种类型,并且(最重要的是)FILE *在本机方面.

本机方法的签名应该是:

FILE * foo(FILE * bar);

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

CustomStream foo(CustomStream bar);

我不想在本机端使用回调方法(一个用于获取更多数据,一个用于设置更多数据).我想FILE *在本机端使用a - 以及所有相关的方法,例如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,让我查看Microsoft文档以更好地了解正在发生的事情,并指出我需要使用该_open_osfhandle方法来获取FILE …

.net c# pinvoke stdout stream

10
推荐指数
1
解决办法
2815
查看次数

在 p 调用非托管 DLL 时获取标准输出?

我有一个非托管的 DLL,它正在将日志消息写入标准输出。我正在使用来自 WPF 应用程序的 P 调用调用此 DLL,我需要获取标准输出流日志。我试过 Console.SetOut,但这似乎只能捕获使用 Console.Write 等编写的信息。

谁有想法?我在其他地方发现了类似的问题,但他们没有答案。

c# pinvoke stdout

8
推荐指数
1
解决办法
3886
查看次数

是否允许将 NULL 作为句柄传递给 SetStdHandle 以禁用 stdout?

我遇到了与这里类似的问题,我有一个写入 stdout 的 P/Invoked 第三方 DLL,我想防止这种情况发生。就我而言,我不想将其重定向到日志文件,而是忽略它。

SetStdHandle(StdOuputHandle, IntPtr.Zero)使用这样做是否正确?

在我的测试中,这似乎有效,但我找不到任何文档表明允许传递 NULL 并将产生所需的效果。

GetStdHandle文档指出:

如果应用程序没有关联的标准句柄(例如在交互式桌面上运行的服务)并且未重定向它们,则返回值为 NULL。

但这与 NULL 意味着取消 SetStdHandle 中现有标准句柄的关联的明确文档相去甚远。

c# stdout

6
推荐指数
0
解决办法
254
查看次数

标签 统计

c# ×3

stdout ×3

pinvoke ×2

.net ×1

stream ×1