我有一个不受信任的 Silverlight 5.1.10411.0 Out-of-Browser应用程序,我正在尝试使用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;
没有成功。我已经非常仔细地阅读了用户发起的事件文档,并且看不出为什么我的代码不被认为是用户发起的。我已经在调试和发布模式以及没有成功连接调试器的情况下尝试过这个。如果我将“在浏览器外运行时需要提升信任”更改为 true,则关闭调用将按预期工作。
我已经重新定义了我的应用程序要求来解决这个问题,但我真的很想了解我做错了什么;-)
更新:SonOfPirate的回答表明此方法的文档不准确,但我不相信。使用反射工具dotPeek抛出异常的方法是
private void CheckForPermissions()
{
if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
我觉得这读起来有点混乱,所以我已经模拟了代码并为它编写了单元测试,如此要点所示,正如你从结果中看到的那样,我应该能够从不受信任的应用程序调用 close,只要它是用户发起。
安全异常消息
除非应用程序具有提升的权限,或者代码是通过用户启动的操作调用的,否则不允许访问属性或方法调用。
还表明它应该是可能的,所以我回到问题 - 为什么这段代码不被认为是用户启动的?