system.io.stream <->;原生 C++文件 *
我有一个 DLL(C++ 本机),它需要 FILE * 参数,因为它使用 fwrite 等操作。 我不想将生成的数据导出到文件,而是导出到 .NET CLR System.IO.Stream (它是一个 Web 应用程序,我想使用 HttpContext.Response.OutputStream)
我开始使用 stdout 并尝试将其进一步链接到输出流,但它会带来一些问题,而且我担心它在多线程时无法正常工作......(只有一个标准输出)。
我为这个问题搜索了几天,似乎找不到好的解决方案。
谢谢,
克里斯托夫
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
C FILE* API 不可扩展。因此,没有记录的方法可以用 FILE* 包装 System.IO.Stream。也许你可以以某种方式破解 CRT,尽管我对此表示怀疑,因为它可能使用全局状态。
用 System.IO.Stream 包装 FILE* 应该很简单。只需实现 Stream 接口即可从 FILE* 读取序列。
如果您可以将 iostream 对象传递给本机接口,您的生活会更轻松。也许您可以修改本机部分(或请求此 DLL 的开发人员)以使用 iostream(实际上是streambuf)接口而不是 FILE*。
编辑:有一个技巧,您可以创建一个单独的进程来运行 DLL 并将 stdin/stdout 作为 FILE* 对象传递到本机接口。另一方面创建一个管道并通过 System.IO.Stream 对其进行读/写。
编辑2: 无需创建新进程即可执行此操作。
The C FILE* API is not extensible. So there is no documented way to wrap a System.IO.Stream with a FILE*. Perhaps you can somehow hack the CRT, although I doubt that because it may use a global state.
Wrapping a FILE* with System.IO.Stream should be straightforward. Just implement the Stream interface which reads the sequence from the FILE*.
If you could pass an iostream object to the native interface your life would be easier. Perhaps you can modify the native part (or request the developer of this DLL) to use an iostream (in fact streambuf) interface instead of FILE*.
EDIT: There is a hack, you can create a separate process which runs the DLL and pass the stdin/stdout as the FILE* object to the native interface. On the other side create a pipe and read/write to it through a System.IO.Stream.
EDIT 2: It's possible to do this without creating a new process.