首页 文章

在一个安装程序exe中一起安装.NET Framework和VB.NET应用程序

提问于
浏览
2

用Visual Basic编写的软件要求.NET框架安装在最终用户的计算机上才能运行 . .net是一个用户可能没有在他们的计算机上的大型软件框架 . 如何使用.NET框架分发我的VB.NET应用程序,以便它可以在用户的计算机上正常运行?

当我尝试创建我的clickonce部署/安装程序时,您会认为它会自动包含最终用户的.NET 4.0设置,它会 not . 当我通过这样的Microsoft文档:How to: Install Prerequisites with a ClickOnce Application所有我得到的东西是我的机器,或实际的.NET可执行文件 . 即使在像InnoSetup这样的第三方安装创建者中,这些似乎都不起作用 .

我需要一个大的 setup.exe 文件中的所有内容 . 我不在乎它是否会占用大量空间,只要它在一个文件中并且所有内容都嵌入在一起(为了方便用户) .

如何打包.NET 4.0框架并使用 ONE Setup.exe 文件中的VB.NET应用程序进行安装?如果这不可能,我在哪里可以找到.NET 4 Framework的实际文件?

2 回答

  • 5

    您需要添加适当的先决条件 . 以下是相应MSDN文档的链接:How to: Install Prerequisites with a ClickOnce Application

  • 1

    我使用InnoSetup来确定是否安装了.NET运行时,如果没有,则自动下载并安装它 . 我在他们的网站上找到了代码 . 此代码未经过测试,但应该能够很好地说明需要完成的工作 .

    [Files]
    Source: "C:\SourceDirectory\dotNetFx40_Client_x86_x64.exe"; DestDir: "{src}";
    

    上面的代码将包含.NET 4.0客户端运行时作为安装程序的一部分 .

    [Code]
    function IsDotNetDetected(version: string; service: cardinal): boolean;
    // Indicates whether the specified version and service pack of the .NET Framework is installed.
    //
    // version -- Specify one of these strings for the required .NET Framework version:
    //    'v1.1.4322'     .NET Framework 1.1
    //    'v2.0.50727'    .NET Framework 2.0
    //    'v3.0'          .NET Framework 3.0
    //    'v3.5'          .NET Framework 3.5
    //    'v4\Client'     .NET Framework 4.0 Client Profile
    //    'v4\Full'       .NET Framework 4.0 Full Installation
    //
    // service -- Specify any non-negative integer for the required service pack level:
    //    0               No service packs required
    //    1, 2, etc.      Service pack 1, 2, etc. required
    var
        key: string;
        install, serviceCount: cardinal;
        success: boolean;
    begin
        key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;
        // .NET 3.0 uses value InstallSuccess in subkey Setup
        if Pos('v3.0', version) = 1 then begin
            success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
        end else begin
            success := RegQueryDWordValue(HKLM, key, 'Install', install);
        end;
        // .NET 4.0 uses value Servicing instead of SP
        if Pos('v4', version) = 1 then begin
            success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
        end else begin
            success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
        end;
        result := success and (install = 1) and (serviceCount >= service);
    end;
    
    function InitializeSetup(): Boolean;
    var
        ResultCode: Integer;
    begin
        if not IsDotNetDetected('v4\Client', 0) then begin
            Exec(ExpandConstant('{src}\dotNetFx40_Client_x86_x64.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            result := (ResultCode == 0);
        end else
            result := true;
    end;
    

相关问题