Silverlight3一个很显著的特点就是其应用可以在浏览器外运行。就是说一个在浏览器中运行的应用可以被独立(detached)出来并通过一个桌面和开始菜单栏图标来启动执行而不在需要有网络连接。这样给人的感觉其就像一个普通的桌面应用而不是一个浏览器应用程序。为了实现独立(detached),用户必须对这类应用有个明确的选择“该应用在没有用户通知的情况下是不可以detached它自己的。下面用一个例子“Hello World”来展示一下UserControlx:ClassSilverlightApplication1.MainPagexmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation%22xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml%22Width400Height300StackPanelx:NameLayoutRootBackgroundWhiteTextBlockx:NametxtStatusTextNot SetHorizontalAlignmentCenterMargin10/ButtonContentClick MeClickOnClickedMargin10//StackPanel/UserControl还有一些代码publicpartialclassMainPage : UserControl{publicMainPage(){InitializeComponent();OnExecutionStateChanged(null,null);App.Current.ExecutionStateChangedOnExecutionStateChanged;}voidOnExecutionStateChanged(objectsender, EventArgs e){txtStatus.TextApp.Current.ExecutionState.ToString();}voidOnClicked(objectsender, RoutedEventArgs args){App.Current.Detach();}}然后我们在浏览器中运行它并看项是灰色的。同样地我们可以在按钮事件中加入一些代码并尝试分离这个应用。voidOnClicked(objectsender, RoutedEventArgs args){App.Current.Detach();}但它并没有启作用因为右键菜单依旧是灰的.原因在于这个应用没有相应的元数据支持。为了提供元数据我们要编辑一下 appmanifest.xml 文件Deploymentxmlnshttp://schemas.microsoft.com/client/2007/deploymentxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlDeployment.Parts/Deployment.PartsDeployment.ApplicationIdentityApplicationIdentityShortNameMikes Silverlight AppTitleMikes App WindowApplicationIdentity.BlurbMikes Application Blurb/ApplicationIdentity.BlurbApplicationIdentity.IconsIconSize16x16icons/16x16.png/IconIconSize32x32icons/32x32.png/IconIconSize48x48icons/48x48.png/IconIconSize128x128icons/128x128.png/Icon/ApplicationIdentity.Icons/ApplicationIdentity/Deployment.ApplicationIdentity/Deployment注上面这些图标文件必须在VS中以内容Content的文件嵌入到XAP文件中。但我并不确保你也需要这里所有的文件特别是这个128x128(文件)这样当单击鼠标右键后该菜单项将会变成“有效”接着我们前面创建的这个按钮将会触发一个对话框提供给我们两个选项“将这个要运行在浏览器外的应用安装到桌面或开始菜单中”。注那是个标准对话框而通过使用我本人头像设置的对话框是下面这个样子但我不打算这样做我想还是显示标准对话框会好一些:)如果点击该对话框后该应用会尝试 detach 它自身。对我而言它所做的工作就是确保本地XAP文件的有效性。而不是去尝试把其它与它相关联的资源也获取到本地。注第二个应用拷贝现在运行在了窗体中它与浏览器窗体还是有一些区别的。现在我在桌面上有了该应用的一个图标并且在开始菜单中也有如果我从这两个地方运行这个应用时会看到一个“非浏览器”的应用此时当我在浏览器中运行这个原始版本的应用时它显示了相同的“Detached”状态好的现在我修改一下原应用将背景设置为red:然后再次运行并发布这个新的XAP到WEB服务器上。起初它显示“Detached”,然后它切换到“DetachedUpdatesAvailable.这意味着可以告诉用户该应用已被更新并提示他们重启该应用​编辑 ​编辑之后将他们再运行该应用时会获取到新的版本我更新到服务器上的那个版本如果想删除该应用可以在本地的“detached”拷贝或浏览器中右击菜单如果我点击上面菜单后就会将开始菜单和桌面图标移除这样在浏览器中该应用的状态就从“Detached”变成了“RunningOnline”.尽管 App.Current.ExecutionState属性返回“Detached”但这与你在浏览器或本地运行该应用是无关的。这是需要有另一个标志来决定该应用是从浏览器还是从本地(分离)启动。在Application中有一个标志即“RunningOffline”看上去它会返回true/false 状态。True意味着当前应用是从本地独立启动的而False则是在浏览器中启动的。就当前应用实际运行的代码而言当其离线时(offline)存在一个进程(文件位于Program Files\Microsoft Silverlight\VERSION\sllauncher.exe).看上去它就是通过应用名称去运行相应程序。使用Reflector去浏览一下发现其进程好像是非托管的运行因此我不认为能从中能获取一些内部信息。但其值得一说的是该launcher的roles之一就是保持应用的上下文安全。