You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter构建Windows发布版:如何将DLL嵌入.exe文件?

将Flutter Windows应用的DLL嵌入EXE的方法

Flutter官方并未提供直接将DLL嵌入EXE的原生支持,但可以通过以下几种方式实现:

方法1:使用Resource Hacker手动嵌入并通过代码提取

步骤1:嵌入DLL到EXE

  1. 打开Resource Hacker,加载Flutter构建生成的your_app.exe
  2. 右键点击左侧面板的Icon Group,选择Add a Resource,选中要嵌入的DLL文件,将资源类型设置为DLL(或自定义类型如BIN),记录资源ID(默认是1)
  3. 保存修改后的EXE文件

步骤2:在Dart代码中提取并加载DLL

添加win32包依赖到pubspec.yaml:

dependencies:
  win32: ^5.0.0

编写提取逻辑,在应用启动时执行:

import 'dart:ffi';
import 'dart:io';
import 'package:win32/win32.dart';
import 'package:flutter/material.dart';

void extractAndLoadDll() {
  final hInstance = GetModuleHandle(nullptr);
  // 匹配Resource Hacker中设置的资源ID和类型
  final hRes = FindResource(hInstance, MAKEINTRESOURCE(1), TEXT('DLL'));
  if (hRes == nullptr) return;

  final hResData = LoadResource(hInstance, hRes);
  final pResData = LockResource(hResData);
  final resSize = SizeofResource(hInstance, hRes);

  // 创建临时目录存放DLL
  final tempDir = Directory.systemTemp.createTempSync('flutter_app_temp_');
  final dllPath = '${tempDir.path}/target_dll.dll';
  final dllFile = File(dllPath);
  dllFile.writeAsBytesSync(
    Pointer<Uint8>.fromAddress(pResData.address).asTypedList(resSize)
  );

  // 加载DLL
  LoadLibrary(TEXT(dllPath));
}

void main() {
  extractAndLoadDll();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(body: Center(child: Text('Embedded DLL Demo'))),
    );
  }
}

方法2:修改CMake构建脚本自动嵌入

步骤1:修改Windows runner的CMakeLists.txt

在项目的windows/runner/CMakeLists.txt中,找到add_executable部分,添加以下代码:

# 替换为你的DLL路径
set(TARGET_DLL "${CMAKE_CURRENT_BINARY_DIR}/your_dll.dll")

# 将DLL作为资源添加到编译目标
target_sources(your_app_name PRIVATE ${TARGET_DLL})
set_source_files_properties(${TARGET_DLL} PROPERTIES
  TYPE RC
)

步骤2:添加资源定义脚本

在windows/runner目录下创建resource.rc文件,内容如下:

1 DLL "your_dll.dll"

步骤3:代码提取逻辑

和方法1中的Dart提取代码一致,启动时从资源中提取并加载DLL。

方法3:使用第三方打包工具(无需修改代码)

比如Enigma Virtual Box(免费版可用):

  • 打开工具,选择Flutter生成的EXE文件作为输入
  • 在Files to Virtualize中添加所有需要打包的DLL文件
  • 设置输出路径后点击Process,生成的独立EXE会在运行时自动加载嵌入的DLL,无需额外文件

注意事项

  • 嵌入DLL会增大EXE体积,需根据实际需求权衡
  • 系统原生DLL(如kernel32.dll、user32.dll)无需嵌入,依赖系统自带文件即可
  • 临时目录提取DLL时,需注意权限问题,部分系统可能限制临时目录的访问
  • 第三方工具打包后,需测试兼容性,避免出现运行时错误

内容的提问来源于stack exchange,提问作者Federico Raimondi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:44:54