Flutter构建Windows发布版:如何将DLL嵌入.exe文件?
将Flutter Windows应用的DLL嵌入EXE的方法
Flutter官方并未提供直接将DLL嵌入EXE的原生支持,但可以通过以下几种方式实现:
方法1:使用Resource Hacker手动嵌入并通过代码提取
步骤1:嵌入DLL到EXE
- 打开Resource Hacker,加载Flutter构建生成的
your_app.exe - 右键点击左侧面板的
Icon Group,选择Add a Resource,选中要嵌入的DLL文件,将资源类型设置为DLL(或自定义类型如BIN),记录资源ID(默认是1) - 保存修改后的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
相关产品推荐
相关产品推荐

