我计划构建一个下载管理器应用程序,并希望能够在用户单击站点按钮时启动该应用程序。该应用程序显然已经需要安装在客户端计算机上。
有几个原因需要使用 Silverlight 编写,但它们与问题并不真正相关。我只是提到它,以便人们不建议我使用另一种技术。
我计划构建一个下载管理器应用程序,并希望能够在用户单击站点按钮时启动该应用程序。该应用程序显然已经需要安装在客户端计算机上。
有几个原因需要使用 Silverlight 编写,但它们与问题并不真正相关。我只是提到它,以便人们不建议我使用另一种技术。
从另外两个帖子 [ 1 ] 和 [ 2 ]中进行一些混搭。
但当然,这只适用于 Windows 而不是 Mac。在那里,您将不得不退回到@michael-s-scherotter风格的解决方案。
private void Button_Click(object sender, RoutedEventArgs e)
{
if (Application.Current.HasElevatedPermissions && System.Windows.Interop.ComAutomationFactory.IsAvailable)
{
string run = "\""%ProgramFiles%\\Microsoft Silverlight\\sllauncher.exe"\" /emulate:"Silverface.xap" /origin:\"http://www.silverlight.net/content/samples/apps/facebookclient/ClientBin/Silverface.xap\" /overwrite";
dynamic cmd = ComAutomationFactory.CreateObject("WScript.Shell");
cmd.Run(run, 1, true);
}
}
如果您同意在用户每次点击时安装该应用程序,这是可能的。
您还应该将应用程序设置为要求对其 OOB 设置提高信任。
只需在启动时卸载应用程序(例如,在主窗口构造函数中):
if (Application.Current.HasElevatedPermissions && Application.Current.InstallState == InstallState.Installed)
{
string launcherPath = string.Empty;
using (dynamic shell = AutomationFactory.CreateObject("Shell.Application"))
{
string launcher64 = @"C:\Program Files (x86)\Microsoft Silverlight";
string launcher32 = @"C:\Program Files\Microsoft Silverlight";
dynamic folder64 = shell.NameSpace(launcher64);
if (folder64 != null)
{
launcherPath = launcher64;
}
else
{
dynamic folder32 = shell.NameSpace(launcher32);
if (folder32 != null)
{
launcherPath = launcher32;
}
}
}
using (dynamic shell = AutomationFactory.CreateObject("WScript.Shell"))
{
var origin = Application.Current.Host.Source.OriginalString;
var launchCmd = string.Format(@"""{0}\sllauncher.exe"" /uninstall /origin:""{1}""", launcherPath, origin);
shell.Run(launchCmd);
}
}
(卸载代码取自这篇文章: http: //www.wintellect.com/blogs/sloscialo/programmatically-uninstalling-silverlight-out-of-browser-application)
我发现了一个技巧,可以从浏览器中的 silverlight 应用程序启动已安装的 silverlight OOB。这两个应用程序都应该被签署并具有更高的信任度。
using (dynamic shell = AutomationFactory.CreateObject("WScript.Shell"))
{
shell.Run(launchPath);
}
我希望这个技巧对你有用:)