.net remoting在wpf中的应用

我做一个remotting的通讯测试,让控制台程序和wpf窗体通讯。具体实现的功能如下:

1、wpf获取信息在控制台上显示

2、控制台启动wpf,以及在屏幕前端显示

首先,我们来看项目结构:

共三个项目,它们分工明确,test是控制台和wpf的公共类库,它定义了双方通讯的接口,以及接口的实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace test
 7 {
 8     public interface IOfficeService
 9     {
10         void Insert(string stream);
11     }
12     [Serializable]
13     public class OfficeServiceImplement : MarshalByRefObject, IOfficeService
14     {
15         public void Insert(string stream)
16         {
17             Console.WriteLine(stream);
18         }
19     }
20
21     public interface IWPFService
22     {
23         IntPtr GetHandle();
24     }
25     [Serializable]
26     public class WPFServiceImplement : MarshalByRefObject, IWPFService
27     {
28         public static Func<IntPtr> GetWPFHandle { set; get; }
29         public IntPtr GetHandle()
30         {
31             if (GetWPFHandle != null)
32             {
33                 return GetWPFHandle();
34             }
35             return IntPtr.Zero;
36         }
37     }
38 }

wfaKnowledgeWarehouse 是个控制台项目,用来接收从wpf传回来的消息,并打印到屏幕上:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.IO;
 6 using System.Runtime.Remoting.Channels.Http;
 7 using System.Runtime.Remoting;
 8 using System.Runtime.Remoting.Channels;
 9 using System.Runtime.Serialization.Formatters;
10 using System.Net.Sockets;
11 using System.Net;
12 using test;
13 using System.Diagnostics;
14 using System.Threading;
15
16 namespace wfaKnowledgeWarehouse
17 {
18     class Program
19     {
20         public const string CHANNEL_NAME = "ConsoleService";
21         public const string OBJECT_URI = "ConsoleService.rem";
22
23         /// <summary>
24         /// 二进制信道处理
25         /// </summary>
26         public static SoapServerFormatterSinkProvider Provider = new SoapServerFormatterSinkProvider()
27         {
28             TypeFilterLevel = TypeFilterLevel.Full
29         };
30
31         static void Main(string[] args)
32         {
33
34             //定义一组服务
35             var channel = new HttpServerChannel(CHANNEL_NAME, 8022, Provider);
36             RemotingConfiguration.RegisterWellKnownServiceType(typeof(OfficeServiceImplement), OBJECT_URI, WellKnownObjectMode.Singleton);
37
38             var consoleInfo = Console.ReadKey();
39
40             if (consoleInfo.Key == ConsoleKey.A)
41             {
42                 //如果按下A,获取wpf窗体句柄
43
44                 var ServiceUrl = "http://" + IPAddress.Loopback.ToString() + ":{0}/WPFService.rem";
45                 var WpfService = Activator.GetObject(typeof(IWPFService), string.Format(ServiceUrl, 8023)) as IWPFService;
46
47                 try
48                 {
49                     //启动客户端
50                     ProcessStartInfo info = new ProcessStartInfo();
51                     info.FileName = @"D:\mywork\WordAddInTest2010\WpfTest\WpfTest\bin\Debug\WpfTest.exe";
52                     info.Arguments = "";
53                     info.WindowStyle = ProcessWindowStyle.Minimized;
54                     Process pro = Process.Start(info);
55
56                     Thread.Sleep(3000);
57
58                    var window= WpfService.GetHandle();
59
60                    Console.WriteLine(window.ToInt32());
61
62                    if (Win32APIs.IsIconic(window) != IntPtr.Zero)
63                    {
64                        Win32APIs.ShowWindow(window, Win32APIs.WindowState.SW_SHOWNOACTIVATE);
65                    }
66
67                    Win32APIs.SetForegroundWindow(window);
68
69                 }
70                 catch (Exception ex)
71                 {
72                     Console.WriteLine(ex);
73                 }
74             }
75             Console.Read();
76         }
77     }
78 }

WpfTest 是wpf项目:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Windows;
 6 using System.Windows.Controls;
 7 using System.Windows.Data;
 8 using System.Windows.Documents;
 9 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14 using System.Net;
15 using test;
16 using System.Windows.Interop;
17 using System.Runtime.Remoting.Channels;
18 using System.Runtime.Remoting.Channels.Http;
19 using System.Runtime.Remoting;
20 using System.Runtime.Serialization.Formatters;
21 using System.Threading;
22 using System.Windows.Threading;
23
24 namespace WpfTest
25 {
26     /// <summary>
27     /// MainWindow.xaml 的交互逻辑
28     /// </summary>
29     public partial class MainWindow : Window
30     {
31         public const string CHANNEL_NAME = "WPFService";
32         public const string OBJECT_URI = "WPFService.rem";
33
34         /// <summary>
35         /// 二进制信道处理
36         /// </summary>
37         public static SoapServerFormatterSinkProvider Provider = new SoapServerFormatterSinkProvider()
38         {
39             TypeFilterLevel = TypeFilterLevel.Full
40         };
41
42         public MainWindow()
43         {
44             InitializeComponent();
45         }
46
47         public static IntPtr WindowPtr { set; get; }
48
49         private void Button_Click(object sender, RoutedEventArgs e)
50         {
51             var ServiceUrl = "http://" + IPAddress.Loopback.ToString() + ":{0}/ConsoleService.rem";
52             var WordService = Activator.GetObject(typeof(IOfficeService), string.Format(ServiceUrl, 8022)) as IOfficeService;
53
54             try
55             {
56                 WordService.Insert("wbq");
57             }
58             catch (Exception ex)
59             {
60                 MessageBox.Show(ex.Message);
61             }
62         }
63
64         public IntPtr GetHandle()
65         {
66             return WindowPtr;
67         }
68
69         private void Window_Loaded(object sender, RoutedEventArgs e)
70         {
71             WindowPtr = new WindowInteropHelper(this).Handle;
72             var channel = new HttpServerChannel(CHANNEL_NAME, 8023, Provider);
73             RemotingConfiguration.RegisterWellKnownServiceType(typeof(WPFServiceImplement), OBJECT_URI, WellKnownObjectMode.Singleton);
74             WPFServiceImplement.GetWPFHandle = GetHandle;
75         }
76     }
77 }

wpf项目定义了提供了WPFService服务,同时它又使用控制台提供的ConsoleService服务。

小结:想想,我们程序员为老板,为公司提供了一定的技术服务,同时得到一些报酬;老板和公司得到一些技术服务的同时,给程序员付一定的报酬。要和这个社会打交道,大抵如此吧。

时间: 2024-10-09 20:47:34

.net remoting在wpf中的应用的相关文章

WPF 中的 loaded 事件和 Initialized 事件

在 WPF 中, 控件有 Loaded 和 Initialized 两种事件. 初始化和加载控件几乎同时发生, 因此这两个事件也几乎同时触发. 但是他们之间有微妙且重要的区别. 这些区别很容易让人误解. 这里介绍我们设计这些事件的背景. (不仅适用于 Control 类, 同样在通用类如 FrameworkElement 和 FrameworkContentElement 类也适用.) 下面是个小故事: Initialized 事件只说: 这个元素已经被构建出来,并且它的属性值都被设置好了,所以

WPF中使用VisualBrush的实例

本文实现一个名为"你来我往"的小程序,该程序管理着"张三"和"李四"两位童鞋拥有的现金,一开始,两人均拥有100美元的现金,随着将现金从其中一人转移至另外一人,两人拥有的现金数在不断变化,程序可以跟踪这种变化,并正确显示每人拥有的现金数.每次最多可以转移三张纸币,纸币的金额可以是5美元.10美元或者20美元. 程序运行后的效果如图1所示,我们点击"张三"右边的"5美元""10美元"&qu

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http

01.WPF中制作无边框窗体

[引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用GDI+自定义绘制. 那么,在WPF中,我们怎样制作一个无边框窗体呢? 答案是将Window的WindowStyle属性设置为None,即WindowStyle="None" .如果是非矩形的异形窗体,则

在WPF中使用fortawesome之类的字体图标

我之前在博客中介绍过几个矢量图库网站,在WPF程序中,一般接触到的矢量图标资源有XAML.SVG.字体这三种格式.XAML是标准格式就不说了,SVG并不是直接支持的,不过微软提供了Expression Design可以非常方便我们将其转换为XAML格式的资源.而对于字体,虽然WPF是直接支持的,但由于字体图标其特殊性,要将其显示为图标还是需要费点劲的.本文这里就以Font-Awesome为例,介绍一下如何在WPF中使用字体图标. 首先添加一个样式,为了使用方便,建议直接做为全局样式: <Styl

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx 本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的Conte

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

WPF中自定义绘制内容

先说结论:实现了在自定义大小的窗口中,加载图片,并在图片上绘制一个矩形框:且在窗口大小改变的情况,保持绘制的矩形框与图片的先对位置不变. 在WinForm中,我们可以很方便地绘制自己需要的内容,在WPF中似乎被限制了,不能够很方便的使用:然后需求有总是奇葩的,所以在这里简单地总结一下. 在WinForm中,如果需要自己绘制,就需要拿到Graphics对象:同样的,我们就希望在WPF也得到一个其同样作用的对象,这个对象就是DrawingContext类的实例对象. 具体来说,就是要重载 UIEle