2024年10月

[Code]
// 检查 .NET Framework 4.8
function IsNetFramework48Installed(): Boolean;
var
    RegKey: String;
    Release: Cardinal;
begin
    Result := False;
    RegKey := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full';
    
    if RegKeyExists(HKLM, RegKey) then
    begin
        if RegQueryDWordValue(HKLM, RegKey, 'Release', Release) then
        begin
            // Release >= 528040 表示已安装 .NET Framework 4.8
            Result := Release >= 528040;
        end;
    end;
end;

// 检查 WebView2 Runtime
function IsWebView2Installed(): Boolean;
var
    RegKey: String;
begin
    Result := False;
    // 检查 32 位注册表
    RegKey := 'SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}';
    if RegKeyExists(HKLM, RegKey) then
    begin
        Result := True;
        Exit;
    end;
    
    // 检查 64 位注册表
    RegKey := 'SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}';
    if RegKeyExists(HKLM, RegKey) then
    begin
        Result := True;
    end;
end;

// 检查 VC++ Runtime
function IsVCRedistInstalled(): Boolean;
var
    RegKey: String;
begin
    Result := False;
    // 检查最新版本的 VC++ Runtime (14.0)
    RegKey := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64';
    if RegKeyExists(HKLM, RegKey) then
    begin
        Result := True;
        Exit;
    end;
    
    // 32位系统检查
    RegKey := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86';
    if RegKeyExists(HKLM, RegKey) then
    begin
        Result := True;
    end;
end;

// 在安装前检查所有依赖
function InitializeSetup(): Boolean;
var
    ErrorMsg: String;
    MissingDependencies: Boolean;
begin
    Result := True;
    MissingDependencies := False;
    ErrorMsg := '请安装以下缺失的组件:' + #13#10#13#10;
    
    if not IsNetFramework48Installed() then
    begin
        ErrorMsg := ErrorMsg + '- .NET Framework 4.8' + #13#10;
        MissingDependencies := True;
    end;
    
    if not IsWebView2Installed() then
    begin
        ErrorMsg := ErrorMsg + '- WebView2 Runtime' + #13#10;
        MissingDependencies := True;
    end;
    
    if not IsVCRedistInstalled() then
    begin
        ErrorMsg := ErrorMsg + '- Visual C++ Runtime' + #13#10;
        MissingDependencies := True;
    end;
    
    if MissingDependencies then
    begin
        ErrorMsg := ErrorMsg + #13#10 + '是否继续安装?';
        if MsgBox(ErrorMsg, mbConfirmation, MB_YESNO) = IDNO then
        begin
            Result := False;
        end;
    end;
end;

缘起

由于最近手里的项目需要加密,每次编译生成后,都需要来回切换好几个工具进行处理,烦不胜烦,最开始在vs中增加了生成事件命令来处理,也是繁琐,干脆就花了点时间写个通用工具来处理了,简单来说,这个软件只是个套壳,本质上是调用其他软件命令来实现的,做了个集成而已,方便使用。

调用软件

  1. 软件合并:ILMerge
  2. 加密:ConfuserEx
  3. 打包:Inno Setup

工程及软件版本

  1. Visual Studio 2022
  2. C# Netframework 4.5.2
  3. DevExpress 22.2
  4. ILMerge 3.0.41
  5. Inno Setup 6
  6. ConfuserEx 1.6.0.72

功能说明

C#程序合并

通过调用ILMerge进行程序合并,可以将多个dll合并到主程序中。

C#程序加密

通过调用ConfuserEx进行主程序加密(如果进行了合并操作,则加密合并后的主程序),默认加密没有使用任何参数,如果需要进行配置的话,参考ConfuserEx的说明文档,并修改工程加密模板文件即可。

C#程序打包

通过调用Inno Setup进行主程序打包,如果需要进行配置的话,参考Inno Setup的说明文档,并修改工程打包模板文件即可。

默认情况下,打包时会自动忽略需要合并的DLL库文件以及备份文件。

注意事项

备份!备份!备份! 虽然说只有合并和加密的时候对原文件进行了处理,并且处理前进行了备份,但是,还是强烈建议你提前对需要处理的软件项目进行备份,以免出现什么稀奇古怪的以外。

软件截图

软件截图

软件源码

https://github.com/hmilyld/ProjectEnc

软件下载

https://github.com/hmilyld/ProjectEnc/releases