【发布时间】:2012-06-29 02:47:32
【问题描述】:
我有一个 Silverlight 5.1.10411.0 Out-of-Browser 应用程序,它是 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 所示,从结果中可以看出,我应该能够从不受信任的应用程序调用 close ,只要它是用户启动的。
安全异常消息
除非应用程序具有提升的权限,或者代码是通过用户启动的操作调用的,否则不允许访问属性或方法调用。
还表明它应该是可能的,所以我回到问题 - 为什么这段代码不被认为是用户启动的?
【问题讨论】:
-
你有几个窗口吗?
-
不,只有一个 MainWindow。
-
您是否尝试过使用按钮的命令?不应该改变任何东西。
-
我尝试使用一个实现ICommand 的类和按钮命令参数,它不会改变行为。我仍然得到相同的 SecurityException。
-
我认为你可以提交一个错误然后:(
标签: silverlight silverlight-5.0