How to use PInvoke in Silverlight 5
A look at how to get started working with P/Invoke in the Silverlight 5 RC.
Introduction
You might have noticed that the Silverlight 5 (Release Candidate) is out. One of the new features included in the RC is the ability to call P/Invoke. In this short demo, we will write a Silverlight 5 application that uses the feature.
Tools needed:
- Visual Studio 2010 SP1 or Visual Web Developer Express 2010 SP1 is required to develop a Silverlight 5 RC application.
- After you have installed VS2010 SP1 or Visual Web Developer Express 2010 SP1, you will need to download and install the Silverlight 5 (Release Candidate) Tools for Visual Studio 2010 SP1.
Getting Started
Go ahead and open Visual Studio 2010 SP1 and select File->New Project, then Silverlight Application.
By default, we have a new option called “Silverlight 5” selected as the Silverlight version. Let’s go ahead and leave it at that. You also have the ability to select Silverlight 3 or 4 from this drop-down.
Let’s go ahead and right click on our project and select Properties.
Put a check in “Enable running application out of the browser”.
Now go ahead and put a check in “Require elevated trust when running outside the browser”.
Switch back over to MainPage.xaml and add in the following code:
<Grid x:Name="LayoutRoot" Background="White">
<Button Height="23" HorizontalAlignment="Left" Margin="169,132,0,0"
VerticalAlignment="Top" Width="75" x:Name="btnclick"
Content="click" Click="click_Click" />
</Grid>
This will simply put a no thrills button on the page that the user can press to call the P/Invoke code we will add shortly.
Let’s go ahead and add a new class to the project.
Let’s call it PlatformInvokeTest.cs and add the following code (Note: If you are having a problem getting it to work, then use my solution at the bottom of the post):
using System;
using System.Runtime.InteropServices;
namespace SilverlightApplication26
{
public class PlatformInvokeTest
{
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
public static void PlaySound()
{
Random random = new Random();
for (int i = 0; i < 50; i++)
{
Beep(random.Next(10000), 100);
}
}
}
}
Let’s switch back over to MainPage.xaml.cs and add the following code:
using System.Windows;
using System.Windows.Controls;
namespace SilverlightApplication26
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void click_Click(object sender, RoutedEventArgs e)
{
PlatformInvokeTest.PlaySound();
}
}
}
Now when the user fires up this project, the application will go out of browser and the computer will beep multiple times in a different frequency each time.
You can also get this same functionality in-browser by going back to the Properties page and selecting “Require elevated trust when running in-browser”.
The only thing to note is that the .aspx page is no longer set to the default in your web project so you will need to do a “View in Browser” on your .aspx page in order to test.
Conclusion
As you can see, it is very easy to use P/Invoke in a Silverlight 5 application. This sample was pretty simple but imagine the possibilities such as detecting when a USB key is inserted into a PC and copying files onto it through a Silverlight 5 application. Pretty cool stuff!
If you want the source code to this application and other Silverlight 5 demos, then be sure to check out Michael’s “Mega Collection of #Silverlight 5" Demos.
Resources
Other Silverlight 5 resources by me are listed below:
- My webinar on “Getting started with the Silverlight 5 Beta”.
- Getting Started with the Silverlight 5 RC
- Getting Started with the Silverlight 5 Beta!
- Game Changing Features in the Silverlight 5 Beta (Part 1)
- Game Changing Features in the Silverlight 5 Beta (Part 2)
- Game Changing Features in the Silverlight 5 Beta (Part 3)