如何为ASP.NET Core / Angular Web应用程序创建安装程序?

问题描述

我们创建了一个“本地” Web应用程序,我的任务是为该应用程序创建一个安装程序,该安装程序将允许用户以编程方式在sqlite或sql Server实现之间进行选择。我对如何做到这一点零头,也没有找到任何有明确方向的好文章

我所要做的就是在Startup.cs文件中编写以下代码,以在位于appsettings.json文件中的两个连接字符串之间进行选择。有谁知道创建/实施安装程序的最佳方法?是否有针对此类问题的开源解决方案?我对此感到很迷茫。...

protected virtual IServiceCollection ConfigureDbContext(IServiceCollection services)
        {
            var issqlServerConnection = Configuration.GetValue<bool>("Usesql");

            if (issqlServerConnection)
            {
                services.AddDbContext<SecurityDbContext>(options =>
                options.UsesqlServer(Configuration.GetConnectionString("Default")).UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),ServiceLifetime.Transient);

                services.AddDbContext<StorageContext>(options =>
                options.Usesqlite(Configuration.GetConnectionString("Default")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking),ServiceLifetime.Transient);
            }
            else
            {
                services.AddDbContext<SecurityDbContext>(options =>
                options.Usesqlite(Configuration.GetConnectionString("sqlite")).UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),ServiceLifetime.Transient);

                services.AddDbContext<StorageContext>(options =>
                options.Usesqlite(Configuration.GetConnectionString("sqlite")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking),ServiceLifetime.Transient);
            }

            return services;
        }

解决方法

使用Visual Studio创建安装程序

  1. 关闭除一个Visual Studio实例外的所有实例。
  2. 在运行的实例中,访问菜单工具->扩展和更新。
  3. 在该对话框中,选择“联机”->“ Visual Studio市场”->“工具”->“设置和部署”。
  4. 从出现的列表中,选择“ Microsoft Visual Studio 2017安装程序项目”。
  5. 安装后,关闭并重新启动Visual Studio。转到文件->新建项目,然后搜索单词Installer。如果您看到类似以下内容的列表,就会知道安装了正确的模板:

vs example

  1. 使用安装项目创建安装程序来满足您的需求。您可以轻松地在安装程序上创建一个页面,用户可以在其中选择SQLite或SQL Server作为支持的数据。

这里有一些有关创建安装程序和所需扩展程序的其他资源。您可能需要其他版本的扩展程序,具体取决于您的Visual Studio版本。

https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects

https://codeteddy.com/2016/04/04/creating-an-msi-package-for-c-windows-application-using-a-visual-studio-setup-project/

https://www.add-in-express.com/docs/net-msi-setup-project.php

,

您也可以使用“ Inno Setup”来创建安装程序。有很多示例代码。基本上,您需要做一些事情。

准备:创建您自己的工具以将信息写入appSettings.json。 exe应将参数作为参数,并基于这些参数生成一个appSetting.json文件。

  1. 在inno设置文件部分中,设置构建的构件和您自己的json生成工具的路径。

//样品代码

[Files]
    Source: bin\*; DestDir: {app}\bin; Flags: recursesubdirs uninsneveruninstall; Components: Main
    Source: Utilities\AppSettingGenerator.exe; DestDir: {app}\Utilities\AppSettingGenerator.exe; Components: " Main"; Tasks: ; Flags: uninsneveruninstall; 
  1. 创建一个屏幕,允许用户选择数据库引擎,sqllite或Sql服务器。
  2. 创建另一个屏幕来设置连接字符串。

//样本代码。创建安装程序屏幕。

procedure FormCreatePage(PreviousPageId: Integer);
begin
    pgeInstallType := CreateInputOptionPage(    wpWelcome,'Select Installation Type','Which type of installation do you want to run?','Select the type of installation that you would like to run. Click Next when you are ready to continue.',true,false
                                             );

    pgeInstallType.Add('Sqllite');
    pgeInstallType.Add('Sql Server');

    pgeInstallType.Values[0] := true;

    
    pgeInput1 := CreateCustomPage(  PreviousPageId,'Configure Sql Server Connection','Please verify the details for those sections highlighted in red before continuing.'
                                 );

    pgeInput2 := CreateCustomPage(  pgeInput1.ID,'Configure Sql lite Connection','Please verify the details for those sections highlighted in red before continuing.'
                                 );
end;

//示例代码。创建UI控件以让用户键入Sql Server连接

pnlSQL := TPanel.Create(pgeInput1);
    with pnlSQL do
        begin
            Parent := pgeInput1.Surface;
            Left := ScaleX(0);
            Top := ScaleY(30);
            Width := ScaleX(413);
            Height := ScaleY(125);
            BevelInner := bvLowered;
        end;

    { lblPnlSQL }
    lblPnlSQL := TLabel.Create(pgeInput1);
    with lblPnlSQL do
        begin
            Parent := pnlSQL;
            Left := ScaleX(340);
            Top := ScaleY(5);
            Width := ScaleX(70);
            Height := ScaleY(13);
            AutoSize := False;
            Caption := 'SQL Server';
            Font.Height := ScaleY(-11);
            Font.Style := [fsBold,fsItalic];
        end;

    { lblSrvName }
    lblSrvName := TLabel.Create(pgeInput1);
    with lblSrvName do
        begin
            Parent := pnlSQL;
            Left := ScaleX(5);
            Top := ScaleY(5);
            Width := ScaleX(66);
            Height := ScaleY(13);
            Caption := 'Server Name:';
            Font.Height := ScaleY(-11);
        end;

    { lblUserID }
    lblUserID := TLabel.Create(pgeInput1);
    with lblUserID do
        begin
            Parent := pnlSQL;
            Left := ScaleX(5);
            Top := ScaleY(25);
            Width := ScaleX(40);
            Height := ScaleY(13);
            Caption := 'User ID:';
            Font.Height := ScaleY(-11);
        end;

    { lblPassword }
    lblPassword := TLabel.Create(pgeInput1);
    with lblPassword do
        begin
            Parent := pnlSQL;
            Left := ScaleX(5);
            Top := ScaleY(46);
            Width := ScaleX(50);
            Height := ScaleY(13);
            Caption := 'Password:';
            Font.Height := ScaleY(-11);
        end;

    { lblDBName }
    lblDBName := TLabel.Create(pgeInput1);
    with lblDBName do
        begin
            Parent := pnlSQL;
            Left := ScaleX(5);
            Top := ScaleY(67);
            Width := ScaleX(80);
            Height := ScaleY(13);
            Caption := 'Database Name:';
            Font.Height := ScaleY(-11);
        end;
  1. 在安装程序屏幕上输入参数后,调用appsettingGenerator工具。

//样本代码。在nextbuttonClick上调用它,然后检查当前页面是否正确

function NextButtonClick(CurPageID: Integer): Boolean; 
var     i: Integer; 
begin 
  if CurPageID = pgeInput2.ID then      
  begin                                 
    RunExe(gUtilAppsettingGenerator,' -dbuid "' + txtUserID.Text + '"
     -dbpass "' + txtPassword.Text + '" -c "server=' + txtSrvName.Text + ';database='    + txtDBName.Text + '" -dbinst "' + txtDSN.Text + '"',ewWaitUntilTerminated,true); 

end;