system.io.stream <->;原生 C++文件 *

发布于 2024-12-09 01:14:06 字数 297 浏览 0 评论 0 原文

我有一个 DLL(C++ 本机),它需要 FILE * 参数,因为它使用 fwrite 等操作。 我不想将生成的数据导出到文件,而是导出到 .NET CLR System.IO.Stream (它是一个 Web 应用程序,我想使用 HttpContext.Response.OutputStream)

我开始使用 stdout 并尝试将其进一步链接到输出流,但它会带来一些问题,而且我担心它在多线程时无法正常工作......(只有一个标准输出)。

我为这个问题搜索了几天,似乎找不到好的解决方案。

谢谢,

克里斯托夫

I got a DLL (C++ native) which requires a FILE * parameter since it uses operations such as fwrite.
I don't want to export the generated data to a file, but to a .NET CLR System.IO.Stream (it's a web app and I want to use the HttpContext.Response.OutputStream)

I started with using stdout and trying to link it further to the outputstream but it gives some problems and I'm afraid it won't work well when it's multithreaded... (There is only one standard output).

I'm searching a few days for this problem and can't seem to find a good sollution.

Thanks,

Kristof

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╰つ倒转 2024-12-16 01:14:06

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文