c# – 如何将数据从托管程序集流传输到本地库并重新启动?

c# – 如何将数据从托管程序集流传输到本地库并重新启动?,第1张

概述如何将数据(文本)从托管程序集传输到本机库,并将数据(文本)流传输到托管程序集? 具体来说,我想在.NET端暴露一些System.IO.Stream,而最重要的是在本地公开一个FILE *. 本机方法的签名应为: FILE * foo(FILE * bar); 本机p / invoke调用周围的包装器的签名应该是: CustomStream foo(CustomStream bar); 我不想在本 如何将数据(文本)从托管程序集传输到本机库,并将数据(文本)流传输到托管程序集?

具体来说,我想在.NET端暴露一些System.IO.Stream,而最重要的是在本地公开一个file *.

本机方法的签名应为:

file * foo(file * bar);

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

CustomStream foo(CustomStream bar);

我不想在本地使用回调方法(一个用于获取更多数据,另一个用于设置更多数据).我想在本地使用一个file *,以及所有与它相关的方法,如fprintf.

我不想要任何磁盘I / O.这需要是内存中的 *** 作.

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

该解决方案必须与.NET 2.0一起使用

我愿意创建任何一种管理或非托管的垫片层来拉出这个.

“明显”的解决方案是使用STDIN和STDOUT并启动一个子进程 – 但是我不想要单独的进程.此外,我尝试将不是Windows上的控制台应用程序的本机库的STDIN和STDOUT流重定向至少有些惊人(而且有很大的冲击).

基于这个问题:
Redirect stdout+stderr on a C# Windows service我尝试修改(至少)解决方案(至少)解决我的问题的一半我的问题 – 但没有一个fileStream(因为我想要一些更类似于一个MemoryStream).然而,fileStream是暴露适当的低级流句柄的唯一流类型.

否则,我很困难,目前我认为我需要更深入地深入了解自己的手工滚动的本机管理流实现,但是并不知道从哪里开始.

最后!

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

http://pastebin.com/jcjHdnwz

这是针对.NET 3.5,并使用AnonymousPipeServerStream – 但是有一点反射镜,它足够复制.NET 2.0中AnonymousPipeServerStream的内部工作.

感谢您的帮助shf301指向我的本机管道API,这让我查看Microsoft文档以更好地了解发生了什么,并指出我需要使用_open_osfhandle方法来获取file *引用.

解决方法 您应该可以使用.NET 3.5或更高版本中的 AnonymousPipeStream来执行此 *** 作.通过您可以传递给SetStdHandle的SafePipeHandle属性来显示一个句柄.

对于.NET 2.0,您可能需要P / Invoke到非托管管道API.

总结

以上是内存溢出为你收集整理的c# – 如何将数据从托管程序集流传输到本地库并重新启动?全部内容,希望文章能够帮你解决c# – 如何将数据从托管程序集流传输到本地库并重新启动?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260325.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存