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/zh-tw/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

發表回復

登錄後才能評論