首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Silverlight离开浏览器应用程序将不会使用MainWindow.Close方法关闭。

Silverlight离开浏览器应用程序将不会使用MainWindow.Close方法关闭。
EN

Stack Overflow用户
提问于 2012-06-28 18:47:32
回答 2查看 879关注 0票数 8

我有一个Silverlight 5.1.10411.0 跳出浏览器应用程序,即不可信,我正在尝试使用App.Current.MainWindow.Close方法关闭应用程序。根据文档,只有在其中一个条件为真的情况下,我才能使用此机制:

  • 它是一个可信的应用程序(对于我的应用程序不是这样)
  • 在Application.Startup事件完成之前(对我的应用程序不适用)
  • 为了响应用户发起的操作,例如,在一个按钮单击事件处理程序中(这就是我要做的)。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void closeButton_Click(object sender, RoutedEventArgs e)
{
    var mainWindow = Application.Current.MainWindow;
    mainWindow.Close();
}

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

SecurityException:不允许访问属性或方法调用,除非应用程序具有提升的权限,或者代码是通过用户发起的操作调用的。

知道为什么我的代码不被认为是用户发起的操作吗?

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 closeButton.Click += closeButton_Click;

但没有成功。我已经非常仔细地阅读了用户启动的事件文档,并且无法理解为什么我的代码没有被认为是用户启动的。我已经尝试过在调试和发布模式,以及当没有附加调试器,但没有成功。如果我将“在浏览器外部运行时要求提升信任”更改为true,则密切调用将按预期工作。

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

UpdateSonOfPirate的回答表明该方法的文档不准确,但我不相信。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void CheckForPermissions()
{
  if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
    throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}

我觉得这有点让人费解,所以我已经模拟了代码,并为它编写了单元测试,如这个要旨所示,正如您从结果中看到的,我应该能够从不受信任的应用程序调用close,前提是它是用户启动的。

安全异常消息

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

还指出这应该是可能的,所以我回到了这个问题--为什么这段代码不被认为是用户启动的?

EN

回答 2

Stack Overflow用户

发布于 2012-07-04 05:24:34

错误就在第一段中,当你说“只有当其中一个条件是正确的时候,你才能使用这个机制:”重读MS文档,你会发现他们没有说这些条件中的“一个”。以下是闭合法的MS参考页面中的确切文本

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

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

正如您所看到的,您需要启用更高的信任。

更新

我承认,微软使用的措辞对前两种情况和第三种情况都有一定的误导性。如果措辞更准确,也许会更清楚:

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

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

Stack Overflow用户

发布于 2014-02-09 22:05:30

如何在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文件部署证书

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11255442

复制
相关文章
C#线程篇---线程池如何管理线程(6完结篇)
C#线程基础在前几篇博文中都介绍了,现在最后来挖掘一下线程池的管理机制,也算为这个线程基础做个完结。   我们现在都知道了,线程池线程分为工作者线程和I/O线程,他们是怎么管理的?   对于Microsoft设计的CLR线程池,线程池会随着CLR的每个版本的发布,都会发生变化,很难去挖掘,这里的提议是:  最好将线程看成一个黑盒。不要拿单个应用程序去衡量这个黑盒的性能,因为它对任何一个应用程序来说都无法做到完美。 相反,它是一种常规用途的线程调度技术,面向大量应用程序;它对某些应用程序的效果要好于其他应
逸鹏
2018/04/10
2.3K0
C#线程篇---线程池如何管理线程(6完结篇)
Linux内存管理 - slab分配器
Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。
用户7686797
2020/08/25
2.4K0
c#线程-线程同步
如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏。如果多个线程不会同时访问共享数据,可以不用线程同步。 线程同步也会有一些问题存在: 1、性能损耗。获取,释放锁,线程上下文建切换都是耗性能的。 2、同步会使线程排队等待执行。
苏州程序大白
2021/08/13
7590
【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )
页 / 阶 概念参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ;
韩曙亮
2023/03/30
7.1K0
C#线程
线程 ----   线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。   多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。   多线程可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。   在 C# 中,System.Threading.Thread
拾点阳光
2018/05/10
8740
【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 )
Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock 分配器 ;
韩曙亮
2023/03/30
1K0
C#线程入门
 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。
aehyok
2019/02/25
5550
C# 多线程
 Thread类的使用: 初始化: Thread th1 = new Thread(function1); Thread th2 = new Thread(new ThreadStart(function1)); Thread th3 = new Thread(new ParameterizedThreadStart(function2)); ThreadStart和ParameterizedThreadStart是两个委托,方法的抽象。 function1...是方法名,在新线程里要执行的方法名。 pu
小端
2018/04/16
1.1K0
线程详解——c#
使用线程,我们需要引用System.Threading命名空间。创建一个线程最简单的方法就是在 new 一个 Thread,并传递一个ThreadStart委托(无参数)或ParameterizedThreadStart委托(带参数),如下:
vv彭
2020/12/16
4280
线程详解——c#
C#多线程
主线程和通过Thread构造函数创建的线程默认都是前台线程,线程池获取的则默认是后台线程,通过 IsBackground 属性可以设置和获取当前线程是前台线程还是后台线程。
全栈程序员站长
2022/09/06
1.4K0
C#多线程
根据上一节中http://www.cnblogs.com/aehyok/archive/2013/05/02/3054615.html对多线程的入门了解。本节就来探讨一下简单的使用多线程。
aehyok
2018/09/11
5330
C#多线程
C#线程入门
 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。
aehyok
2018/09/11
5240
C#线程入门
Go并不需要Java风格的GC
像Go、Julia和Rust这样的现代语言不需要像Java c#所使用的那样复杂的垃圾收集器。但这是为什么呢? 我们首先要了解垃圾收集器是如何工作的,以及各种语言分配内存的方式有什么不同。首先,我们看
Robert Lu
2021/12/05
9250
C#多线程(12):线程池
线程池全称为托管线程池,线程池受 .NET 通用语言运行时(CLR)管理,线程的生命周期由 CLR 处理,因此我们可以专注于实现任务,而不需要理会线程管理。
痴者工良
2021/04/26
1.5K0
C#多线程(6):线程通知
回顾一下,前面 lock、Monitor 部分我们学习了线程锁,Mutex 部分学习了进程同步,Semaphor 部分学习了资源池限制。
痴者工良
2021/04/26
9110
C#多线程(11):线程等待
前面我们学习了很多用于线程管理的 类型,也学习了多种线程同步的使用方法,这一篇主要讲述线程等待相关的内容。
痴者工良
2021/04/26
2.3K0
C#多线程开发-线程基础 01
最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决了。后来发觉自己对于线程的知识和运用不是很熟悉,所以将利用几篇文章来系统性的学习汇总下C#中的多线程开发。
冬夜先生
2021/09/03
4450
C#多线程调试
这篇文章主要分享多线程部分调试技巧,在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微软官方的文档地址。
JusterZhu
2022/12/07
7600
C#多线程调试
C#多线程(8):线程完成数
假如,程序需要向一个 Web 发送 5 次请求,受网路波动影响,有一定几率请求失败。如果失败了,就需要重试。
痴者工良
2021/04/26
5170
C#多线程开发-线程池03
前面2篇文章介绍了线程的基础知识和线程同步,下面我们来一起认识学习下,线程池的使用。
zls365
2021/09/24
9130
C#多线程开发-线程池03

相似问题

如何管理加载动画线程?- C#

21

分配器与多线程

11

C#:管理线程等待队列

21

内存管理与std::分配器

23

如何管理多线程c#应用程序

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文