在Silverlight 4中受信应用已经被支持,受信应用简单的说就是可以访问一些本地受限资源的Silverlight应用。在Silverlight 4中受信应用必须是OOB类型,即必须先安装在本地,同时受信应用能访问的资源也有限,例如只能访问我的文档、我的图片等位置的文件。而在Silverlight 5中受信应用的功能做了很大的改进和增强:
成都创新互联主要从事成都做网站、成都网站制作、成都外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务商南,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
受信应用可以运行于浏览器之内
可以无限制的访问本地文件系统
访问强安全性方法时,不会再引发MethodAccessException异常
当运行于桌面模式时,可以创建多个窗口
在Windows平台可以直接调用非托管函数
可以看到,在Silverlight 5中受信应用的权限几乎获得了与桌面应用相当的权限,在这里,我将为大家介绍如何创建浏览器内的受信应用。以下示例将通过Silverlight来监视本地的网络流量。
受信应用的创建与常规Silverlight应用没有差异,直接通过新建项目来创建:
要使应用受信任,必须修改项目的属性,必须勾选“允许在浏览器外允许程序”,以及“在浏览器内运行时需要提升的权限”:
单击浏览器外设置按钮,进入以下设置界面,勾选“在浏览器之外运行时需要提升的信任”,由于我们的应用只允许在浏览器内运行,所以可将“显示安装菜单”的复选框去掉。这里说明一下,由于受信应用在Silverlight之前版本是和浏览器外运行绑定的,所以这里我们可以看到,虽然现在不使用浏览器外运行方式,但也需要对OOB进行设置,以此来获取受信模式。
实现功能。我们将调用非托管的Win32 API来实现本地网络流量的监视,在Silverlight 5中,调用本地非托管函数的方式与.NET下完全一致。具体请参照本文源码,代码片段:
- public static class WIN32API
- {
- [DllImport("kernel32.dll")]
- public static extern bool GetComputerName(StringBuilder computerName, out Int32 nameLength);
- [DllImport("Iphlpapi.dll")]
- private static extern Int32 GetIfTable(Byte[] pIfTable, out long pdwSize, bool bOrder);
- [DllImport("kernel32.dll")]
- private static extern int MultiByteToWideChar(uint CodePage,Int32 dwFlags,byte[] lpMultiByteStr,Int32 cbMultiByte,byte[] lpWideCharStr, int cchWideChar);
- public static MIB_IFTABLE GetIfTable()
- {
- MIB_IFTABLE table = new MIB_IFTABLE();
- long size = 0;
- GetIfTable(null, out size, false);
- if (size != 0)
- {
- Byte[] data = new Byte[size];
- long ret = GetIfTable(data, out size, false);
- if (ret == 0)
- {
- MemoryStream ms = new MemoryStream(data);
- ms.Position = 0;
- BinaryReader br = new BinaryReader(ms, Encoding.Unicode);
- table.dwNumEntries = br.ReadInt32();
- table.table = new MIB_IFROW[table.dwNumEntries];
- for (int i = 0; i < table.dwNumEntries; i++)
- {
- table.table[i] = new MIB_IFROW();
- MIB_IFROW curRow = table.table[i];
- FieldInfo[] fis = typeof(MIB_IFROW).GetFields();
- foreach (FieldInfo fi in fis)
- {
- if (!fi.IsStatic)
- {
- MarshalAsAttribute[] attrs = fi.GetCustomAttributes(typeof(MarshalAsAttribute), true) as MarshalAsAttribute[];
- if (attrs != null && attrs.Length > 0 && attrs[0].SizeConst != 0)
- {
- if (fi.FieldType == typeof(String))
- {
- Byte[] tmpChars = br.ReadBytes(attrs[0].SizeConst*2);
- fi.SetValue(curRow, Encoding.Unicode.GetString(tmpChars, 0, tmpChars.Length).TrimEnd('\0'));
- }
- else if (fi.FieldType == typeof(Byte[]))
- {
- fi.SetValue(curRow, br.ReadBytes(attrs[0].SizeConst));
- }
- }
- else
- {
- if (fi.FieldType == typeof(Int32))
- {
- Int32 tmpValue = br.ReadInt32();
- fi.SetValue(curRow, tmpValue);
- }
- }
- }
- }
- }
- }
- }
- return table;
- }
- public static String AsciiToUTF8(Byte[] asciiBytes)
- {
- int mustBytes = MultiByteToWideChar(WIN32CONST.CP_ACP, WIN32CONST.MB_PRECOMPOSED, asciiBytes, -1, null, 0);
- if (mustBytes > 0)
- {
- Byte[] tmpBytes = new Byte[mustBytes*2];
- if (MultiByteToWideChar(WIN32CONST.CP_ACP, WIN32CONST.MB_PRECOMPOSED, asciiBytes, -1, tmpBytes, mustBytes) != 0)
- {
- return Encoding.Unicode.GetString(tmpBytes, 0, tmpBytes.Length);
- }
- }
- return "";
- }
- }
在后期生成事件命令行中输入以下命令,进行xap的时间戳签名:
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\signtool.exe" sign /v /f "$(ProjectDir)TrustedApp_1_TemporaryKey.pfx" /p test /t http://timestamp.comodoca.com/authenticode $(TargetName).xap
前面为signtool的全路径,它通常位于所安装的Windows SDK目录下, /f 后面跟随证书的全路径,以上示例表示当前项目下的TrustedApp_1_TemporaryKey.pfx证书文件,/p 后面表示证书的密码,/t 后面跟随一个CA Authenticode Timestamping Service的URL地址,命令***部分为需要签名的xap文件。
进行此步操作后,每次生成xap文件后,Visual Studio将自动调用次命令进行xap的时间戳签名。这样,客户端重新访问网页时,即可自动下载更新xap。
网站标题:创建Silverlight5浏览器内受信应用
文章地址:http://www.shufengxianlan.com/qtweb/news1/210451.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联