65.9K
CodeProject 正在变化。 阅读更多。
Home

使用设置项目安装 Silverlight OOB 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (7投票s)

2011年4月11日

CPOL

6分钟阅读

viewsIcon

62598

downloadIcon

1151

本文演示了如何使用安装项目安装 Silverlight OOB 应用程序。

引言

在本文中,我们将介绍如何通过安装项目安装 Silverlight OOB 应用程序。Silverlight OOB 应用程序(简称 OOB)非常类似于桌面应用程序,可以安装、启动和卸载。这些 OOB 通常是从浏览器中通过右键单击 Silverlight 控件并选择“安装应用程序到此计算机”来安装的,但有时我们需要考虑其他安装方式,例如当我们需要 OOB 应用程序能在机器之间轻松分发,或者将 OOB 作为批量安装的一部分进行安装等。本文将帮助您了解如何通过安装项目安装 OOB 应用程序。

为了方便读者理解,我将文章分成了以下几个主要部分。

  1. 一点理论知识 - 在本节中,我们将了解 sllauncher 是什么,以及如何使用它从命令提示符手动安装、卸载 OOB 应用程序。
  2. 项目计划 - 在本节中,我们将讨论我们的项目计划以及在安装项目中需要配置的内容。
  3. 自定义安装程序 - 在本节中,我们将了解需要重写哪些 Installer 基类方法,以及如何实际调用 sllauncher 来安装或卸载示例应用程序。

让我们开始阅读本文!

一点理论知识

a. sllauncher 是什么?

当我们安装 Silverlight 插件时,一些文件会被下载到计算机。如果导航到“%ProgramFiles%\Microsoft Silverlight\”文件夹,可以看到以下内容:

图 a. Microsoft Silverlight 安装目录
  • 4.0.51204.0 - 此文件夹包含所有 Silverlight 框架程序集。
  • sllauncher.exe - 当我们安装、启动或卸载任何 OOB 应用程序时将被调用的进程。
sllauncher.exe 是在安装、启动和卸载任何 OOB 应用程序中起关键作用的进程。每当您启动 OOB 应用程序时,它都会在一个单独的 sllauncher 进程下运行。

b. sllauncher.exe 选项

要了解 sllauncher 的各种选项,请打开命令提示符并运行:

"%ProgramFiles%\Microsoft Silverlight\sllauncher.exe"  

我们将看到如下所示的错误消息框:

图 b. sllauncher.exe 选项

这清楚地表明,如果不传递一些参数,我们无法直接使用 sllauncher.exe,并且消息框也显示了它可用的各种选项。下表列出了各种选项及其用途。

选项 描述
app_id 每当安装 OOB 应用程序时,XAP 和关联的内容都位于一个唯一命名的文件夹下,这个唯一名称称为 app_id,当 sllauncher 启动已安装的应用程序时,会使用此参数来定位它。
/install: <XAP 的文件路径>

此选项用于安装 OOB 应用程序,传递 XAP 文件的物理路径,例如:/install: D:\SilverlightSamples\SampleOOB.xap

/emulate: <XAP 的文件路径> 此选项用于在不安装的情况下以仿真模式启动 OOB 应用程序。
/origin: <原始应用程序 URI>

此选项指定 XAP 文件来自的 URI。此 URI 用于安全目的和自动更新。例如:/origin: http://mywebsite.com/SampleOOB.xap

/overwrite 在安装当前版本时覆盖任何以前安装的版本。建议将此选项与 /install 开关一起使用。

/shortcut: <desktop|startmenu |desktop+startmenu|none>

此选项指定要在桌面、开始菜单、两者兼有或都不创建快捷方式的位置。
/debug 包含此选项将以调试模式启动应用程序。

假设我们有一个名为 SampleOOB.xap 的示例 OOB 应用程序,位于 D:\SilverlightSamples\ 文件夹下,并且 XAP 托管在 http://mywebsite.com/

要安装 OOB 应用程序,我们必须从命令提示符运行以下命令:

"%ProgramFiles%\Microsoft Silverlight\sllauncher.exe" 
/install:D:\SilverlightSamples\SampleOOB.xap /shortcut:desktop+startmenu 
/origin:http://mywebsite.com/SampleOOB.xap /overwrite 

要卸载应用程序,我们必须运行命令:

"%ProgramFiles%\Microsoft Silverlight\sllauncher.exe" /uninstall 
/origin:http://mywebsite.com/SampleOOB.xap 

项目计划

a. 解决方案

我们的计划是从安装程序运行上述命令。当安装程序进行安装时,我们将通过启动 sllauncher 并传递安装参数来安装 Silverlight OOB 应用程序;当安装程序进行卸载时,我们将通过启动 sllauncher 并传递必要参数来卸载已安装的 OOB 应用程序。为此,我们需要创建一个自定义安装程序类,并将其放在单独的程序集中。

下面是附加源代码的解决方案资源管理器视图:

图 c. 项目解决方案资源管理器视图

我们的解决方案包含四个项目:

  • SlApp - 示例 Silverlight 应用程序
  • SlInstaller - 包含我们的自定义安装程序类的程序集
  • SlWeb - 托管 XAP 组件的 Web 应用程序
  • SlSetup - 安装项目

b. 在安装项目中需要配置的内容

我们在安装项目中需要进行以下配置:

  • 右键单击安装项目 -> 添加 -> 项目输出 -> 主要输出 (SlApp)。
  • 右键单击安装项目 -> 添加 -> 文件 -> 位于 Web 应用程序的 ClientBin 文件夹中的 SlApp.xap
  • 右键单击安装项目 -> 查看 -> 自定义操作。


图 d. 在安装项目中配置自定义操作

右键单击左侧列中的每个自定义操作(Install、Commit..)并选择自定义操作 -> 应用程序文件夹 -> 来自 SlInstaller 的主要输出 (Active)。

CustomActionData 属性中传递安装目录路径,我们将在安装程序类中检索此路径以定位 SlApp.xap 路径。为此,右键单击 Install 自定义操作下的来自 SlInstaller 的主要输出 (Active) 节点 -> 转到属性 -> 将 CustomActionData 输入为 /INSTALLDIR="[TARGETDIR]\"

图 e. 在 CustomActionData 中传递参数

自定义安装程序

自定义安装程序项目 SlInstaller 包含 SlInstaller 类,该类扩展了内置的 Installer 类,为此我们需要添加对 System.Configuration.Install 程序集的引用。[注意:不要忘记在类上方添加 RunInstaller 属性]。

/// <summary>
/// Custom Installer Class
/// </summary>
[RunInstaller(true)]
public class SlInstaller : Installer
{

} 

Installer 类包含许多虚拟方法,但我们只需要重写其中的几个:OnAfterInstallUninstall。您可能会疑惑为什么我们重写 OnAfterInstall 而不是 Install。我们这样做是因为要安装 OOB 应用程序,我们需要 XAP 文件 (SlApp.xap),该文件将在基础安装完成后才会下载到安装目录。

OnAfterInstall 中,我们将运行命令来安装 OOB 应用程序;在 Uninstall 方法中,我们将运行命令来卸载 OOB 应用程序。

/// <summary>
/// Custom Installer Class
/// </summary>
[RunInstaller(true)]
public class SlInstaller : Installer
{
    protected override void OnAfterInstall(IDictionary savedState)
    {
        //Run command to install Silverlight OOB app.
        base.OnAfterInstall(savedState);
    }

    public override void Uninstall(IDictionary savedState)
    {
        //Run command to uninstall Silverlight OOB app.
        base.Uninstall(savedState);
    }
} 

首先,在 OnAfterInstall 方法中编写安装代码。为了安装 OOB 应用程序,我们需要以下参数来构成命令行字符串:

  1. sllauncher.exe 路径
  2. XAP 文件的物理路径
  3. XAP 文件的来源 URI

由于 Silverlight 的安装文件夹因计算机而异,获取 sllauncher.exe 路径有点棘手,但通过使用 Environment 类,我们可以获得正确的路径而无需硬编码。

string sllauncherPath = string.Format("{0}\\Microsoft Silverlight\\sllauncher.exe", 
                Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)); 

我们可以通过 Context 对象中的 Parameters 集合获取通过 CustomActionData 传递的 XAP 文件的物理路径。

//getting the installation folder to get the XAP file's physical path.
string installDir = Context.Parameters["INSTALLDIR"];
string xapPath = string.Format("{0}{1}", 
installDir.Substring(0, installDir.Length - 1), "SlApp.xap");   

XAP 托管在示例 Web 应用程序 (SlWeb) 中,假设它运行在端口 5555 上,因此 XAP 的源 URI 将是 https://:5555/ClientBin/SlApp.xap

public const string originUri = "https://:5555/ClientBin/SlApp.xap";  

现在,构造命令行 string args 并创建一个新进程来调用 sllauncher.exe

//form the command-line string
string args = string.Format(@"/install:""{0}"" 
/origin:""{1}"" /shortcut:""desktop+startmenu"" /overwrite", xapPath, originUri); 

var startInfo = new ProcessStartInfo
{
    CreateNoWindow = true,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    FileName = sllauncherPath,
    Arguments = args
};

using (var process = Process.Start(startInfo))
{
    process.StandardOutput.ReadToEnd();
}  

在上面的代码中,我们创建了一个新的 ProcessStartInfo 实例,它在其 FileName 属性中包含 sllaucher.exe 进程路径,并在 Arguments 属性中包含命令行参数,然后我们创建一个新的 Process 实例,将 ProcessStartInfo 实例传递给构造函数。

这就是安装的所有代码。卸载代码与上述代码非常相似,并且必须在 Uninstall 方法中编写,如下所示:

public override void Uninstall(IDictionary savedState)
{
    //Uninstall Silverlight OOB app.
    //getting the sllauncher.exe with complete path
    string sllauncherPath = string.Format("{0}\\Microsoft Silverlight\\sllauncher.exe",
        Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));

    string args = string.Format(@"/uninstall /origin:""{0}""", originUri);
            
    var startInfo = new ProcessStartInfo
    {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        FileName = sllauncherPath,
        Arguments = args
    };

    using (var process = Process.Start(startInfo))
    {
        process.StandardOutput.ReadToEnd();
    }

    base.Uninstall(savedState);
}  

演示

我已附上包含文章中所列所有项目的示例源代码。请仔细阅读并发表您的宝贵评论。

参考

© . All rights reserved.