使用设置项目安装 Silverlight OOB 应用程序
本文演示了如何使用安装项目安装 Silverlight OOB 应用程序。
引言
在本文中,我们将介绍如何通过安装项目安装 Silverlight OOB 应用程序。Silverlight OOB 应用程序(简称 OOB)非常类似于桌面应用程序,可以安装、启动和卸载。这些 OOB 通常是从浏览器中通过右键单击 Silverlight 控件并选择“安装应用程序到此计算机”来安装的,但有时我们需要考虑其他安装方式,例如当我们需要 OOB 应用程序能在机器之间轻松分发,或者将 OOB 作为批量安装的一部分进行安装等。本文将帮助您了解如何通过安装项目安装 OOB 应用程序。
为了方便读者理解,我将文章分成了以下几个主要部分。
- 一点理论知识 - 在本节中,我们将了解 sllauncher 是什么,以及如何使用它从命令提示符手动安装、卸载 OOB 应用程序。
- 项目计划 - 在本节中,我们将讨论我们的项目计划以及在安装项目中需要配置的内容。
- 自定义安装程序 - 在本节中,我们将了解需要重写哪些 Installer 基类方法,以及如何实际调用 sllauncher 来安装或卸载示例应用程序。
让我们开始阅读本文!
一点理论知识
a. sllauncher 是什么?
当我们安装 Silverlight 插件时,一些文件会被下载到计算机。如果导航到“%ProgramFiles%\Microsoft Silverlight\”文件夹,可以看到以下内容:
- 4.0.51204.0 - 此文件夹包含所有 Silverlight 框架程序集。
- sllauncher.exe - 当我们安装、启动或卸载任何 OOB 应用程序时将被调用的进程。
b. sllauncher.exe 选项
要了解 sllauncher 的各种选项,请打开命令提示符并运行:
"%ProgramFiles%\Microsoft Silverlight\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 应用程序。为此,我们需要创建一个自定义安装程序类,并将其放在单独的程序集中。
下面是附加源代码的解决方案资源管理器视图:
我们的解决方案包含四个项目:
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]\"。
自定义安装程序
自定义安装程序项目 SlInstaller
包含 SlInstaller
类,该类扩展了内置的 Installer
类,为此我们需要添加对 System.Configuration.Install
程序集的引用。[注意:不要忘记在类上方添加 RunInstaller 属性]。
/// <summary>
/// Custom Installer Class
/// </summary>
[RunInstaller(true)]
public class SlInstaller : Installer
{
}
Installer
类包含许多虚拟方法,但我们只需要重写其中的几个:OnAfterInstall
和 Uninstall
。您可能会疑惑为什么我们重写 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 应用程序,我们需要以下参数来构成命令行字符串:
- sllauncher.exe 路径
- XAP 文件的物理路径
- 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);
}
演示
我已附上包含文章中所列所有项目的示例源代码。请仔细阅读并发表您的宝贵评论。