两个本地 Silverlight 应用程序之间的通信
关于如何与两个本地 Silverlight 应用程序通信。

引言
让我感到惊讶的是,很少有人讨论“基于 Silverlight 的本地应用程序之间的通信”这一特性。 这并非 Silverlight 的新功能,它自 Silverlight 3 以来就已存在。 换句话说,这将允许在同一台 PC 上运行的两个 Silverlight 应用程序无需使用 Web 服务等方式进行相互通信。 最初,我研究这个功能是为了一个与 Kinect 配合使用的个人项目,但发现它非常有价值,并决定与大家分享。
入门
我们将创建两个独立的 Silverlight 应用程序(选择 Silverlight 4 或 5 Beta)。 我们要创建的第一个应用程序是接收器。
创建接收器
启动 Visual Studio 2010 并创建一个新的 Silverlight 应用程序,命名为“SilverlightReceiver
”。
在您的 MainPage.xaml 中
<Grid x:Name="LayoutRoot" Background="Yellow">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
TextWrapping="Wrap" Text="...Waiting for Message!" x:Name="txtReceiver"/>
</Grid>
在您的 MainPage.xaml.cs 中
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Messaging;
namespace SilverlightReceiver
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Loaded += MainPage_Loaded;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var messageReceiver = new LocalMessageReceiver
("receiver", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
messageReceiver.MessageReceived += receiver_MessageReceived;
try
{
messageReceiver.Listen();
}
catch (ListenFailedException)
{
MessageBox.Show(
"Cannot receive messages." + Environment.NewLine +
"There is already a receiver with the name 'receiver'.",
"LocalMessageReceiver", MessageBoxButton.OK);
}
}
private void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
{
txtReceiver.Text = e.Message;
e.Response = "Message received";
}
}
}
在设计模式下,您的接收器的 MainPage.xaml 应该如下所示

创建发送器
启动 Visual Studio 2010 并创建一个新的 Silverlight 应用程序,命名为“SilverlightSender
”。
在您的 MainPage.xaml 中
<Grid x:Name="LayoutRoot">
<Button Content="Send a Message" Click="SendClick" Margin="10"/>
</Grid>
在您的 MainPage.xaml.cs 中
using System.Windows;
using System.Windows.Controls;
using System.Windows.Messaging;
namespace SilverlightSender
{
public partial class MainPage : UserControl
{
private LocalMessageSender _messageSender = new LocalMessageSender("receiver");
public MainPage()
{
InitializeComponent();
Loaded += MainPage_Loaded;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
_messageSender = new LocalMessageSender("receiver",LocalMessageSender.Global);
_messageSender.SendCompleted += _sender_SendCompleted;
}
void _sender_SendCompleted(object sender, SendCompletedEventArgs e)
{
MessageBox.Show("Response \"" + e.Response +
"\" receieved.", "LocalMessageSender", MessageBoxButton.OK);
}
private void SendClick(object sender, RoutedEventArgs e)
{
_messageSender.SendAsync("Don't you love michaelcrump.net?");
}
}
}
在设计模式下,您的接收器的 MainPage.xaml 应该如下所示

现在开始运行它!
首先启动接收器应用程序…

然后启动发送器应用程序…

单击“发送消息”按钮,您应该立即看到

现在单击您的接收器应用程序…

…您会看到它现在有了从“发送器”应用程序发送的消息。
结论
这太酷了! 此外,它不需要任何 Web 服务等! 作为参考,您可以查看 MSDN 上的这些页面(我从中获取了一些此演示的代码)。
历史
- 2011 年 8 月 3 日:初始版本