Silverlight Out-of-Browser应用程序不会使用MainWindow.Close方法关闭

时间:2012-06-29 02:47:32

标签: silverlight silverlight-5.0

我有一个Out-of-Browser的Silverlight 5.1.10411.0 NOT trusted应用程序,我正在尝试使用App.Current.MainWindow.Close方法关闭应用程序。根据文档,如果其中一个条件成立,我只能使用这种机制:

  • 这是一个受信任的应用程序(不适用于我的应用程序)
  • 在Application.Startup事件完成之前(对我的应用程序不适用)
  • 响应用户启动的操作,例如,在按钮Click事件处理程序中(这就是我想要的工作)

在我试图让它工作的过程中,我保持了非常简单的操作,并且直接在按钮单击事件处理程序后面的代码中调用方法,如下所示,但它没有任何效果。

void closeButton_Click(object sender, RoutedEventArgs e)
{
    var mainWindow = Application.Current.MainWindow;
    mainWindow.Close();
}

当我附加调试器并设置“抛出异常时中断”时,我可以看到异常

  

SecurityException:不访问属性或方法调用   除非应用程序具有提升的权限或代码,否则允许   通过用户发起的行动召集。

为什么我的代码不被视为用户启动的操作?

我尝试在XAML和代码隐藏中同时附加事件处理程序(不是同时)

 <Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />

 closeButton.Click += closeButton_Click;

没有成功。我已经非常仔细地阅读了User-Initiated Events文档,并且无法理解为什么我的代码不被视为用户启动。我已经在调试和发布模式以及没有成功附加调试器时尝试了这一点。如果我将“在浏览器外部运行时需要提升的信任”更改为true,则关闭调用将按预期工作。

重新定义了我的应用程序要求来解决这个问题,但我真的很想了解我做错了什么; - )

更新SonOfPirate的回答表明此方法的文档不准确,但我不相信。使用反射工具dotPeek抛出异常的方法是

private void CheckForPermissions()
{
  if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
    throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}

我觉得这有点令人困惑,所以我已经嘲笑了代码并为它编写了单元测试,如gist所示,你可以从结果中看到我应该能够从不受信任的应用程序,前提是它是用户启动的。 Window Close Security Test Results

安全例外消息

  

除非应用程序具有提升的权限,或者通过用户启动的操作调用了代码,否则不允许访问属性或方法调用。

也表明它应该是可能的,所以我回到了这个问题 - 为什么这个代码不被认为是用户启动的?

2 个答案:

答案 0 :(得分:3)

如果您声明“如果其中一个条件成立,您只能使用此机制”,那么错误就出现在第一段中:“重新阅读MS文档,您会看到他们没有说”一个“这些条件。以下是Close method的MS参考页中的确切文字:

  

您只能在以下情况下调用此方法:

     
      
  • 响应用户启动的操作,例如,在按钮Click事件处理程序中。
  •   
  • 在Application.Startup事件完成之前(即在IApplicationService.StartService方法中,IApplicationLifetimeAware.Starting)   方法,或启动事件处理程序)。
  •   
  • 在受信任的应用程序中。
  •   

如您所见,您需要启用提升信任。

<强>更新

我承认,微软使用的措辞有点误导,与前三种情况相结合的前两种情况都是如此。如果措辞更加准确,也许会更清楚:

  

在以下任何一种情况下,您只能在受信任的应用程序中调用此方法:

     
      
  • 响应用户启动的操作,例如,在按钮Click事件处理程序中。
  •   
  • 在Application.Startup事件完成之前(即在IApplicationService.StartService中)   方法,IApplicationLifetimeAware.Starting方法或Startup事件处理程序)。
  •   

答案 1 :(得分:0)

如何在silverlight中提升webBrowser控件的权限:

1- http://msdn.microsoft.com/en-us/library/gg192793%28v=vs.96%29.aspx 主题: 启用浏览器内可信应用

2- http://www.johnpapa.net/digitally-signing-a-xap-silverlight/ 主题: 以数字方式签署XAP Silverlight

3- http://chainding.wordpress.com/2012/09/19/silverlight-5-trusted-applications/ 主题: 添加所需的注册表设置      签署您的XAP文件       部署证书

确保已签名的证书部署在本地计算机和当前用户的受信任发布者中。