Mar*_*rth 8 silverlight silverlight-5.0
我有一个不受信任的Silverlight 5.1.10411.0 Out-of-Browser应用程序,我试图使用App.Current.MainWindow.Close方法关闭应用程序.根据文档,如果满足以下条件之一,我只能使用此机制:
在我试图让它工作的过程中,我保持了非常简单的操作,并且直接在按钮单击事件处理程序后面的代码中调用方法,如下所示,但它没有任何效果.
void closeButton_Click(object sender, RoutedEventArgs e)
{
var mainWindow = Application.Current.MainWindow;
mainWindow.Close();
}
Run Code Online (Sandbox Code Playgroud)
当我附加调试器并设置"抛出异常时中断"时,我可以看到异常
SecurityException:除非应用程序具有提升的权限,或者通过用户启动的操作调用了代码,否则不允许访问属性或方法调用.
有什么想法为什么我的代码不被视为用户启动的操作?
我已经尝试在XAML和代码隐藏中附加事件处理程序(不是同时)
<Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />
Run Code Online (Sandbox Code Playgroud)
要么
closeButton.Click += closeButton_Click;
Run Code Online (Sandbox Code Playgroud)
没有成功.我已经非常仔细地阅读了用户启动的事件文档,并且无法理解为什么我的代码不被视为用户启动.我已经在调试和发布模式以及没有成功附加调试器时尝试了这一点.如果我将"在浏览器外部运行时需要提升的信任"更改为true,则close调用将按预期工作.
我已经重新定义了我的应用程序要求来解决这个问题,但我真的想了解我做错了什么;-)
更新:SonOfPirate的回答表明这种方法的文档不准确,但我不相信.使用反射工具dotPeek抛出异常的方法是
private void CheckForPermissions()
{
if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
Run Code Online (Sandbox Code Playgroud)
我觉得这是一个有点混乱读,所以我一直嘲笑的代码,写它的单元测试见下面的要点,正如你可以从结果看,我应该能够从不受信任的应用程序调用Close,只要它是用户启动.

安全异常消息
除非应用程序具有提升的权限,或者通过用户启动的操作调用了代码,否则不允许访问属性或方法调用.
也表明它应该是可能的,所以我回到了这个问题 - 为什么这个代码不被认为是用户启动的?
错误就在第一段,当您声明“只有在满足以下条件之一时才能使用此机制”时,请仔细阅读 MS 文档,您会发现他们没有说“一个”这些条件。以下是来自 MS 参考页的Close 方法的确切文本:
仅在以下情况下可以调用该方法:
- 响应用户启动的操作,例如,在按钮 Click 事件处理程序中。
- 在 Application.Startup 事件完成之前(即,在 IApplicationService.StartService 方法、IApplicationLifetimeAware.Starting 方法或 Startup 事件处理程序中)。
- 在受信任的应用程序中。
正如您所看到的,您需要增强信任。
更新
我承认,对于前两种情况需要与第三种情况结合使用的情况,微软使用的措辞有点误导。如果更准确地表述为:也许会更清楚:
仅在以下任一情况下,您才能在受信任的应用程序中调用此方法:
- 响应用户启动的操作,例如,在按钮 Click 事件处理程序中。
- 在 Application.Startup 事件完成之前(即,在 IApplicationService.StartService 方法、IApplicationLifetimeAware.Starting 方法或 Startup 事件处理程序中)。