如何让Wix Bundle调用内嵌MSI中DLL函数实现代码共享?
Wix Bundle与内嵌MSI共享代码实现方案
1. 构建共享函数DLL
创建独立的C++类库项目,把isLegit()这类需要共享的函数封装为导出接口,供Bundle和MSI调用:
- 头文件(
SharedFunctions.h):
#pragma once #ifdef SHARED_DLL_EXPORTS #define SHARED_API __declspec(dllexport) #else #define SHARED_API __declspec(dllimport) #endif // 声明共享函数 SHARED_API bool isLegit();
- 实现文件(
SharedFunctions.cpp):
#include "SharedFunctions.h" bool isLegit() { // 这里编写你的验证逻辑 return true; }
- 项目设置:在C++预处理器定义中添加
SHARED_DLL_EXPORTS,编译后会生成对应的.dll和.lib文件。
2. 在Wix Bundle(Burn)中调用共享DLL
如果使用自定义引导程序应用(Custom BA),直接将共享DLL的.lib文件添加到BA项目的链接器依赖,包含头文件后即可直接调用函数:
#include "SharedFunctions.h" // 在BA的业务逻辑中调用 if (isLegit()) { // 执行后续安装流程 }
编译时确保BA项目的架构(x86/x64)与共享DLL一致,最终将共享DLL和BA的输出EXE一起打包到Bundle的 payload 中。
3. 在MSI项目中调用共享DLL
将共享DLL作为二进制资源嵌入MSI,通过自定义动作调用:
- 在WiX项目中添加二进制资源:
<Binary Id="SharedFunctionsDll" SourceFile="$(SolutionDir)SharedDll\bin\$(Configuration)\SharedFunctions.dll" />
- 定义自定义动作并插入到执行序列:
<CustomAction Id="ValidateLegit" BinaryKey="SharedFunctionsDll" DllEntry="isLegit" Return="check" /> <InstallExecuteSequence> <!-- 在成本计算完成后执行验证逻辑 --> <Custom Action="ValidateLegit" After="CostFinalize" /> </InstallExecuteSequence>
- 注意:自定义动作返回值设为
check时,若isLegit()返回false会终止安装流程。
4. 替代头文件复用的优势
之前直接用.h文件包含函数实现,会导致代码在多个项目中重复编译,后续修改需要同步所有引用文件。改用共享DLL后:
- 代码仅编译一次,维护成本大幅降低
- 统一逻辑实现,避免多版本不一致问题
- 可对核心逻辑做封装,无需暴露实现细节
内容的提问来源于stack exchange,提问作者Shaharni
相关产品推荐
相关产品推荐

