65.9K
CodeProject is changing. Read more.
Home

How to use PInvoke in Silverlight 5

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (5 votes)

Sep 12, 2011

CPOL

3 min read

viewsIcon

45493

downloadIcon

691

A look at how to get started working with P/Invoke in the Silverlight 5 RC.

Description: image

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:

Getting Started

Go ahead and open Visual Studio 2010 SP1 and select File->New Project, then Silverlight Application.

Description: SNAGHTML425f655

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.

Description: SNAGHTML427e8ce

Let’s go ahead and right click on our project and select Properties.

Description: image

Put a check in “Enable running application out of the browser”.

Description: image

Now go ahead and put a check in “Require elevated trust when running outside the browser”.

Description: SNAGHTML2b29bb45

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.

Description: image

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”.

Description: image

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.

Description: image

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: