Installing and running a Silverlight application out-of-browser makes it possible to create a better experience to the user. Sometimes it is necessary to update the installed application and with the build-in functionality in Silverlight it is a pretty straight forward operation.
Depending on your application the update should be done early on in the application. Normally I do it as part of the Application Startup event before setting the RootVisual.
First we need to make sure the update is only done if the user is actually running the application out-of-browser. Application.Current.IsRunningOutOfBrowser will be true if the user has installed the application and running it out-of-browser.
On the Application.Current object we can call the CheckAndDownloadUpdateAsync method. This will check if an update is available and download it. The method is an asynchronous method and we need to subscribe on its complete event to complete the update.
If an update is available (and have been downloaded) the UpdateAvailable property of event arguments for the complete event will be true. The update (the new XAP file) have been downloaded but not installed as it is not possible to remove the old XAP file since the user is actually using it to run the application. Therefore the user need to restart the application to install the update.
In some applications it is ok not to require the user to restart the application but in most scenarios it is the preferred solution – think about service updates and so on.
At the moment it is not possible to separate the check and download. It is not possible to check if an update is available and the ask the user if she wish to actually download the update. If the CheckAndDownloadUpdateAsync method is called both check and download will be invoked.
In most debug scenarios this update check will be annoying since the XAP file will be updated everytime you build your project. To overcome this I normally adds an if-not-debug (#if !DEBUG) around the update check.
Source code is available here.
If you’re looking for the minimum requirements for Silverlight 4, you will probably browse to
. However if you go to
you will get disappointed – the minimum requirements listed is for Silverlight 3.
Windows: Intel® Pentium® III 450MHz or faster processor (or equivalent)
Mac OS: Intel Core™ Duo 1.83GHz or faster processor
I was told by Microsoft that the minimum requirements remains the same for Silverlight 3 and Silverlight 4. However if you go to the Silverlight install page you can see the minimum requirements for the most current version of Silverlight (4.0.50826.0):
Windows: X86 or x64 1.6-gigahertz (GHz) or higher processor
Macintosh: Intel Core Duo 1.83-gigahertz (GHz) or higher processor
I’m confused… Well, for future requests regarding the minimum requirements I would choose the Silverlight install page.
Edit: Turned out that the information on the FAQ was wrong and will be corrected. Minimum requirements is 1.6 GHz.
With Silverlight 3 we got the opportunity to create Silverlight applications that install on the client machine. With Silverlight 4 we can require that the applications get elevated permissions to the client machine. We are able to access local files on the client machine and communicate with hardware and installed applications using COM under the same privileges as the logged in user.
It’s important that the user understands that an installed Silverlight application that runs with elevated permissions should be considered just like any other installed application. It’s no longer a web application that runs in a sandbox!
Scenario 1 – install without signed application
By default, when the user choose to install a Silverlight application that requires elevated permissions she get a security warning that the publisher of the application could not be verified.
“This application does not have a valid digital signature that verifies the publisher. You should only run software from publishers you trust.”
The security warning does not tell the user anything about the harm that this application potentially can course. Instead it has focus on the missing certificate.
Scenario 2 – install signed application
If we try to sign the application with a certificate and install the application again we will see a much more accurate security warning.
“This application can potentially access your personal data and harm your computer. Only install applications from sites you trust.”
The security warning now inform the user about the harm that this application potentially can course. Why isn’t the user warned in the first scenario? I hope (and believe) that this be fixed in a future version.
It has become increasingly popular to use the Model-View-ViewModel (MVVM) in Silverlight. It’s easy to use the MVVM in Silverlight and it opens up for some extended testing scenarios. With Silverlight 4 we can also use some of the features from MEF (Managed Extensibility Framework). One scenario is to use MEF to load the ViewModel to a View.
How to do it
For this demo I have created a Silverlight project with a view called CustomerView.xaml and a viewmodel called CustomerViewModel.cs. The view contains an ItemsControl with an ItemTemplate that I will use to display a list of Customers and their address. I have bound the ItemsSource to the Customers property from my viewmodel.
In the code-behind of the MainPage.xaml file hosting the view, I have created a property called ViewModel. When the ViewModel property is set it will set the DataContext of our view to the provided value. I have added an Import attribute to the ViewModel. The Import attribute declare that this property relies on a service provided by some other component.
I have added an Export attribute to the CustomerViewModel class. The Export attribute declares that this class provides a particular kind of service.
To connect the components together I need to resolve the Imports and Exports. It is done by a class called CompositionContainer. In most cases you will just call CompositionInitializer.SatisfyImports method to try and provide components that export all the things you need to import.
You can write your own CompositionContainer explicitly if you want.
My viewmodel will now be resolved and an instance will be set the DataContext of the view.
This is a very simplified sample and can seem a bit like shooting birds with cannons. In larger scale you will really see the power of using this solution where your views do not need to know about its viewmodel.
This solution will let you use an other viewmodel in designtime supporting the use of using a viewmodel and Expression Blend.
On the other hand this solution will add some complexity to the project. It will be harder to follow the code and it is often not clear from looking at the code what sorts of objects you’re really using or how they were instantiated.
Get the sample code here:
Silverlight 4 makes it possible to use the AutomationFactory (COM) to communicate with applications installed on the client computer.
To use the AutomationFactory it’s required that the application runs as an out-of-browser application with elevated trust. Furthermore it’s required that the user can use the COM (the client must run on a Windows computer for COM to work – Microsoft have stated they are looking into getting COM+ support working in Silverlight 4 RTM on a Mac).
In the sample above I first of all check that the user is running the application with elevated trust and that the AutomatationFactory is available. I create a new dynamic object as an instance of Outlook and a new mail object. I set the To, Subject and Body on the mail object, saves it and finally sends it.
Silverlight 4 introduces a WebBrowser control which I have written a short post about this control here.
To demonstrate the functionality of ScriptNotify event, I have created a Silverlight 4 project and an ASP.NET webproject that hosts the Silverlight project. I have made the Silverlight project an out-of-browser application – this is necessary to display HTML in the WebBrowser.
In the Silverlight project I have added a WebBrowser control on the MainPage.xaml and I have set the source to our HTML-page on the server.
In the code-behind I subscript to the WebBrowser’s ScriptNotify event and implement an EventHandler.
To invoke the ScriptNotify event from the HTML-file I need to pass a string to the Silverlight plug-in. The Silverlight hosting environment allows you to call Notify on the Window.external object and pass a string to the plug-in. When you do this, the ScriptNotify event occurs.
You can download the demo project here.
One of the new features in Silverlight 4 is implicit styling (thank you, Microsoft!). To prevent unwanted surprises of inheritance there some limitations. It’s only possible to set the exact TargetType on a style that you wish to use. Hence it’s not possible to set TargetType to ButtonBase and let all types of buttons (Button, CheckBox, RadioButton…) implicit use the style.
One of the new controls in Silverlight 4 is a webbrowser control. The control lets you navigate to specified Uri’s and you could actually build your own Silverlight browser using the control.
But what is underneath the hood? Is it an Internet Explorer or does it use your default browser engine? Before finding the answer to this question I had a pretty good feeling about the result. To find out I constructed a very simple Silverlight application containing only the webbrowser control. I hardcoded the source of the control to
– a website that can tell a little information about the browser that is used to navigate to the site.
On this computer Microsoft Internet Explorer 8.0.7600.16385 is my default browser. From
I got the following result:
Browser: Microsoft Internet Explorer || Version: Mozilla 4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Trying to set my default browser to Google Chrome 220.127.116.11 did not change on the result found above.
You find the Silverlight application here.
Yesterday I did a talk about Silverlight 4 at a Øredev Knowledge Network event in Copenhagen, Denmark hosted by Jayway. The talk had focus on introducing Silverlight and the new possibilities that comes with Silverlight 4.
I hope that everybody could understand me even though I sounded like a geeky version of Godfather.
You can download the slides here and the demos here.
Earlier today I did a short talk about Silverlight 4 at a Microsoft Web Partner event in Hellerup, Denmark. The talk had focus on the new line-of-business possibilities that comes with Silverlight 4.
Due to the very short time there wasn’t time to questions – if you have any don’t hesitate to contact me.
You can download the slides here and the demos here.