当前位置: 首页 > 知识库问答 >
问题:

node.js - c#能返回nodejs可用的stream或buffer吗?

陈宏胜
2023-06-29

因为我没学过c语言,标题可能有许多错误,请见谅。

我用electron开发一个桌面软件,需要获取exe文件的图标(不要app.getFileIcon这东西),在网上找了一圈没有可用的。最理想的是extracticon.exe,但它只能生成png文件

我需要ReadableStreamBuffer

Electron:

protocol.handle('exei', () => {
    let url = request.url.slice("exei:///".length)
    let imgStream = exeToPng(url) // 提取exe图标返回stream?
    return new Response(
      imgStream, 
      { headers: { 'content-type': 'image/png' } }
    );
});

[c#] exeToPng.exe:
参考ExtractIcon源码

namespace exeToPng
{
   public partial class Program
   {
        static void Main(string[] args
        {
            MemoryStream memoryStream = new MemoryStream();
            // ...
            iconBMP.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
            iconBMP.Dispose();
            // 我不知道是否有可能返回这个memoryStream
        }
    }
}

如果返回stream是可能的,希望能提供一下代码,如果不能,是否意味着我只能先保存为图片后在node中读取?谢谢

共有1个答案

章学义
2023-06-29

二进制字节数组的话直接是 byte[]。Stream 就是用于流式访问 byte[] 的。

你这里直接 memoryStream.ToArray() 就可以得到 byte[] 了。


不过看起来你的需求是想通过 Electron 调用 C# 里的方法?

原则上这是可行的,相当于 Electron 把 C# 当动态链接库用呗,有 edge.js 之类的现成的开源方案。但这需要你懂得 C# 的一些基础知识,起码得知道什么是程序集、什么是反射。但题主没学过 C# 的话这种方式学习成本还是挺高的,所以建议还是通过临时文件中转。

其实通过临时文件在两个程序之间传递数据是一种非常常见的方式。比如很多视频类型转换器,其实就是做了个 GUI 的“壳”,里面调用的是 ffmpeg,互操作也是通过临时文件的方式。

 类似资料:
  • 主要内容:Buffer 与字符编码,创建 Buffer 类,写入缓冲区,从缓冲区读取数据,将 Buffer 转换为 JSON 对象,缓冲区合并,缓冲区比较,拷贝缓冲区,缓冲区裁剪,缓冲区长度,方法参考手册JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。 在 Node.js 中,Buffer 类是随 Node 内核一起发布的

  • 更新了Promise示例。 我正在运行NodeJS,并且在多个-语句和-语句中遇到问题。我正在尝试使用,这似乎是一种方法。 这是我的示例代码: 它似乎没有等待Promise2完成数据库查询。 如何确保在返回任何语句之前完成数据库查询?

  • 有可能有一个返回整数或浮点的函数吗?如果可能的话,我想把这两个函数合二为一:

  • 问题内容: 我正在从第三方网站(家庭用电)中检索JSON,并且根据我从该站点的要求,返回的JSON可能是数组,也可能不是数组。例如,如果我请求我的智能电表列表,则会得到以下信息(由于尺寸较大,结果被截断了): 其中 gwrcmd 是单个元素。 但是,如果我要求最近半小时用电,则会得到以下信息: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个看起来像这样的结构(再次被截断了一

  • Java1.8正在接收类,它允许我们显式地说明一个方法何时可能返回空值,并在使用它之前“强制”它的使用者验证它是否为空()。 我看到C#有,它执行类似的操作,但使用的是基本类型。它似乎用于DB查询,以区分值是否存在且为0,以及值是否不存在且为NULL。 但似乎C#的对对象不起作用,只对基本类型起作用,而Java的只对对象起作用,对基本类型不起作用。 在C#中是否有一个可为空的/可选的类,迫使我们在

  • 描述 (Description) C库函数void setbuf(FILE *stream, char *buffer)定义了如何缓冲流。 一旦与流关联的文件已经打开,但在进行任何输入或输出操作之前,应调用此函数。 声明 (Declaration) 以下是setbuf()函数的声明。 void setbuf(FILE *stream, char *buffer) 参数 (Parameters)