Goembed:嵌入文件和dll

Goembed是一个Go编程语言中用于将文件和其他资源直接嵌入到代码中的工具。在使用过程中,Goembed可将文件如图片、CSS文件以及其他文本文件和DLL嵌入应用程序中,这样可以大大简化应用程序的部署和管理。接下来,我们将从不同的方面来详细阐述Goembed的嵌入文件和DLL功能。

一、Goembed嵌入DLL

1、嵌入单个DLL

Go语言本身是跨平台支持的,但是,为了实现相应的功能,还需要诸如动态链接库(DLL)之类的资源添加到应用程序中。如果您想在应用程序中嵌入一个简单的DLL文件,Goembed将为您提供具有以下文件内容的DLL文件:

//go:embed sample.dll
var d []byte

我们可以使用go generate命令来生成将DLL嵌入应用程序中的文件。因此,我们需要更新go.mod文件:

module demo

go 1.16

require (
    github.com/lxn/walk v0.0.0-20210809111303-dbed2ece652c
)

//go:generate go run ./tools/embeddll.go

该代码往go.mod文件添加了嵌入代码的进程。接下来,我们需要添加一个名为embeddll.go的新文件,并将如下内容添加到其中:

package main

import (
    "io/ioutil"
    "log"
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    out, err := os.Create("demo.rc")
    if err != nil {
        log.Fatal(err)
    }
    defer out.Close()

    // Write .rsrc file header
    out.WriteString("1 24 \"demo.exe.manifest\";\n")
    out.WriteString(`1 14 "MICROSOFT_D2D" {`);
    out.WriteString("FONT ");
    out.WriteString("DEFAULT_GUI_FONT");
    out.WriteString(" {\n");
    out.WriteString("  DIALOGEX 8, 8, 161, 36\n");
    out.WriteString("  STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\n")
    out.WriteString("  CAPTION \"\"\n");
    out.WriteString("  FONT 9, \"MS Shell Dlg\", 0, 0, 0x1\n");
    out.WriteString("}\n");
    out.WriteString("}\n");

    // Write command to embed the DLL
    out.WriteString("1 24 \"sample.dll\" {\n");
    out.WriteString("  RCDATA sample.dll\n");
    out.WriteString("}\n");

    out.Sync()

    // use rc.exe to compile .rc file to .syso
    cmd := exec.Command("cmd", "/c", "rc.exe", "/fo", "demo.syso", "demo.rc")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err = cmd.Run()
    if err != nil {
        log.Fatal(err)
    }

    err = os.Remove("demo.rc")
    if err != nil {
        log.Fatal(err)
    }
}

这个示例代码演示了如何将单个DLL文件嵌入应用程序中并在Windows上运行该应用程序。

2、嵌入多个DLL

如果您需要嵌入多个DLL文件,可以使用以下两种不同的方法来完成:

第一种方法:在每个DLL文件上使用相同的名称,即将每个DLL文件重命名为template.dll并运行以下命令:

go generate
golibrsrc -o myresource.syso *.dll

第二种方法:使用以下命令将每个DLL文件分别转换为.SYSO文件,并在应用程序代码中嵌入这些文件:

//go:embed sample1.dll sample2.dll sample3.dll
var d []byte

二、Goembed嵌入文件夹选取

如果您想将文件夹中的所有文件嵌入到应用程序中,则可以使用以下代码:

//go:embed mydirectory/*
var embeddedFS embed.FS

f, err := embeddedFS.Open("mydirectory/myfile.txt")
if err != nil {
  log.Fatal(err)
}

b, err := ioutil.ReadAll(f)
if err != nil {
  log.Fatal(err)
}

fmt.Println(string(b))

使用此代码,将在示例文件夹中的所有文件(包括子文件夹)嵌入到名称为d的[]byte变量中,我们可以使用此[]byte变量访问所有文件。

3、Goembed选择文件夹

如果您只想嵌入文件夹中的一些文件,则可以在路径中指定嵌入的文件。例如,假设我们只想嵌入文件夹中的文件.txt和file2.txt,我们可以使用以下代码:

//go:embed mydirectory/file.txt mydirectory/file2.txt
var embeddedFS embed.FS

f, err := embeddedFS.Open("mydirectory/file.txt")
if err != nil {
  log.Fatal(err)
}

b, err := ioutil.ReadAll(f)
if err != nil {
  log.Fatal(err)
}

fmt.Println(string(b))

使用此代码,只有文件夹中file.txt和file2.txt文件将嵌入到名称为d的[]byte变量中。我们可以使用此[]byte变量访问两个文件。

总结

通过使用Goembed,我们可以轻松地将文件和其他资源嵌入到Go应用程序中,避免了将文件保存在磁盘上并需要相应的文件位置的繁琐过程。无论是嵌入单个DLL还是文件夹,Goembed都能简化您的代码,并让您的应用程序更易于部署和管理。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/182921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-24 16:25
下一篇 2024-11-24 16:25

相关推荐

  • vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常问题的解决

    本文旨在解决vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常的问题,提供完整的代码示例供参考。 一、分析问题 首先,需了解vue中下载文件的情况。一般情况下,我们…

    编程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • Python中读入csv文件数据的方法用法介绍

    csv是一种常见的数据格式,通常用于存储小型数据集。Python作为一种广泛流行的编程语言,内置了许多操作csv文件的库。本文将从多个方面详细介绍Python读入csv文件的方法。…

    编程 2025-04-29
  • 为什么用cmd运行Java时需要在文件内打开cmd为中心

    在Java开发中,我们经常会使用cmd在命令行窗口运行程序。然而,有时候我们会发现,在运行Java程序时,需要在文件内打开cmd为中心,这让很多开发者感到疑惑,那么,为什么会出现这…

    编程 2025-04-29
  • Python程序文件的拓展

    Python是一门功能丰富、易于学习、可读性高的编程语言。Python程序文件通常以.py为文件拓展名,被广泛应用于各种领域,包括Web开发、机器学习、科学计算等。为了更好地发挥P…

    编程 2025-04-29
  • Python zipfile解压文件乱码处理

    本文主要介绍如何在Python中使用zipfile进行文件解压的处理,同时详细讨论在解压文件时可能出现的乱码问题的各种解决办法。 一、zipfile解压文件乱码问题的根本原因 在P…

    编程 2025-04-29
  • Python将矩阵存为CSV文件

    CSV文件是一种通用的文件格式,在统计学和计算机科学中非常常见,一些数据分析工具如Microsoft Excel,Google Sheets等都支持读取CSV文件。Python内置…

    编程 2025-04-29
  • Python如何导入py文件

    Python是一种开源的高级编程语言,因其易学易用和强大的生态系统而备受青睐。Python的import语句可以帮助用户将一个模块中的代码导入到另一个模块中,从而实现代码的重用。本…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • Python写文件a

    Python语言是一种功能强大、易于学习、通用并且高级编程语言,它具有许多优点,其中之一就是能够轻松地进行文件操作。文件操作在各种编程中都占有重要的位置,Python作为开发人员常…

    编程 2025-04-29

发表回复

登录后才能评论