试图让我的 C 插件使用与 NodeJS 使用但卡住的 C 运行时相同的 C 运行时

Trying to make my C addon uses the same C runtime with the C runtime that NodeJS uses but got stuck

如果你们必须知道我实际上在做什么,那就是它:https://github.com/Meigyoku-Thmn/CSBinary(.NET Core 的 BinaryReader 和 BinaryWriter 的端口)。

问题是,我的库没有 File Buffering(请再次从我的另一个库 post 获取,这与 NodeJS 中的缓冲区 class 无关),我想利用 C 运行时的 I/O 系统,而不必编写 BufferedFile class(想想 .NET 中的 BufferedStream class)。

在C语言中,如果你open/create一个文件(fopen) and get a FILE* instance, then it's doing file buffering behind the scene, you can even set the file buffer size (again, nothing to do with the Buffer class) by using the setvbuf函数。

而且我认为如果我手头有一个文件描述符(由 fs 模块创建),我可以使用 fdopen 函数将其包装 it/associate 到一个 FILE* 实例中,并获取内置 C 运行时的文件免费缓冲。

不幸的是,NodeJS 似乎是使用静态 link 构建的。所以我的插件使用独立于 NodeJS 使用的 C 运行时。从 NodeJS 创建的文件描述符不能直接在我的插件中使用,而且 libuv 没有类似于 fdopen 的东西。

根据 NodeJS 文档中的 this section,有一种情况是 node-gyp 将“下载完整的源代码 tarball”并让我“可以完全访问 Node.js依赖项”。可能是这样,但除了指定 nodedir 标志(这需要我手动准备“本地 Node.js 源图像”)之外,文档非常模糊。

所以这是死胡同吗,谁有这方面的经验,请帮帮我。

最终,我找到了一种方法:

int nodejs_fd = gotFromJs();
// on POSIX-system, fd is process-wide, so I don't have to do anything
int fd = nodejs_fd;
// but on Windows, fd is just simulated on top of OS-Handle
// so it's bound to a specific C runtime, and my addon use a separate C runtime.
// therefore, I cannot just pass it to fdopen (EBADF)
// but I can still get the OS-handle
#ifdef _WIN32
HANDLE fh = (HANDLE)uv_get_osfhandle(nodejs_fd);
// so I can just open my own fd that points to it, side-by-side with the fd of NodeJS
fd = _open_osfhandle((intptr_t)fh, _O_RDONLY);
#endif
// and problem solved
FILE* file = fdopen(fd, "rb");