.Net Framework 2.0 使用WCF
2015-12-25 09:51
295 查看
起因:公司一个项目,采用VS2008开发,客户机配置参疵不齐,低配置不在少数。.Net Framework 3.5实在臃肿,安装太慢,又想用3.0的WCF进行分布式开发,于是就想到是否可以在.Net Framework 2.0上使用WCF。
思路:既然.Net Framework 3.0和3.5都是在2.0基础上的扩展,那么我们完全可以手工引用3.0以上的程序集(所有用到的),这有点类似于VB中引用OCX控件,用到哪个就引用那个。当然,不排除有某个程序集的依赖项也是3.0以上版本的,这就需要.Net Reflector 出马了。
步骤:
第一步:先在Vs2008中用默认的.Net Framework 3.5编写WCF程序(客户端和服务端均可),运行调试成功后降编译版本到2.0,然后会在引用中出现几个找不到的引用文件。
图1
![](http://c.hiphotos.baidu.com/album/pic/item/4afbfbedab64034f0ab3752eaec379310a551d9f.jpg)
将这些文件找出来,位置一般在两个文件夹里面,它们分别是“C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5”、“C:\WINDOWS\Microsoft.NET\Framework”。
把他们通过引用中的浏览加入到程序引用中(会弹出一警告窗口说该DLL或其依赖项之一要求的Framework版本比项目指定的版本高,忽略即可)。
图2
![](http://h.hiphotos.baidu.com/album/pic/item/71cf3bc79f3df8dcee4538b9cc11728b47102899.jpg)
这时我们会发现该引用的路径仍然是“系统无法找到指定的引用”,要解决很简单——选中该引用,修改其属性的特定版本为True即可,同时设置复制本地属性为True。
图3
![](http://b.hiphotos.baidu.com/album/pic/item/37d12f2eb9389b504e4c577a8435e5dde7116e62.jpg)
至此程序应该是可以成功运行了!生成程序后,我们要把Release文件夹中所有文件进行发布。记着一定要祭出.Net Reflector,挨个程序集看看是否有依赖项是3.0以上的,若有则Copy之。但是这样能在只有2.0的机器上顺利运行吗?未必!
第二步:这次来到只有2.0的机器上,运行程序,会出现一堆万恶的E文。
图4
![](http://a.hiphotos.baidu.com/album/pic/item/aec379310a55b319938d355d42a98226cffc17a5.jpg)
大意是缺少配置文件之类的,其中有"ServiceModelReg.exe -i"字样。
那就依计行事——
在C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation中找到并执行
ServiceModelReg.exe -i
图5
![](http://f.hiphotos.baidu.com/album/pic/item/91529822720e0cf36a80f9d30b46f21fbe09aaa7.jpg)
然后再次运行程序,大功告成。
图6
![](http://c.hiphotos.baidu.com/album/pic/item/7c1ed21b0ef41bd5ff225fdc50da81cb39db3da0.jpg)
重要声明:所谓的.net FrameWork 2.0务必是2.0 SP2。当时笔者在此纠结了很长时间,后来通过VS2008环境和纯2.0环境的比对才发现问题所在。VS2008中的2.0实际已经是SP2了(详细版本号是2.0.50727.3053),而我安装的测试环境只是2.0(详细版本号是2.0.50727.42),差别还是比较大的。
备注:VS2008和纯.NET 2.0的系统均为XP SP2,其他环境暂时没测试。这种方法ms也可以用到其他3.0以上的其他扩展程序集,比如3.5的Linq。
总结:
.net FrameWork 2.0库运行WCF客户端程序以下四要素:
1、客户端的.net FrameWork 2.0库必须为SP2,看详细版本号(SP2为2.0.50727.3053)。
2、通过浏览引用System.ServiceModel.dll,修改其属性中的特定版本为True,同时设置复制本地为True。
3、附带必要的程序集——
SMdiagnostics.dll
System.IdentityModel.dll
System.Runtime.Serialization.dll
System.ServiceModel.dll
System.ServiceModel.Install.dll (ServiceModelReg -i ServiceModel注册必要程序集)
ServiceModelReg.exe (ServiceModelReg -i 安装程序)
4、ServiceModelReg -i 进行注册
思路:既然.Net Framework 3.0和3.5都是在2.0基础上的扩展,那么我们完全可以手工引用3.0以上的程序集(所有用到的),这有点类似于VB中引用OCX控件,用到哪个就引用那个。当然,不排除有某个程序集的依赖项也是3.0以上版本的,这就需要.Net Reflector 出马了。
步骤:
第一步:先在Vs2008中用默认的.Net Framework 3.5编写WCF程序(客户端和服务端均可),运行调试成功后降编译版本到2.0,然后会在引用中出现几个找不到的引用文件。
图1
![](http://c.hiphotos.baidu.com/album/pic/item/4afbfbedab64034f0ab3752eaec379310a551d9f.jpg)
将这些文件找出来,位置一般在两个文件夹里面,它们分别是“C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5”、“C:\WINDOWS\Microsoft.NET\Framework”。
把他们通过引用中的浏览加入到程序引用中(会弹出一警告窗口说该DLL或其依赖项之一要求的Framework版本比项目指定的版本高,忽略即可)。
图2
![](http://h.hiphotos.baidu.com/album/pic/item/71cf3bc79f3df8dcee4538b9cc11728b47102899.jpg)
这时我们会发现该引用的路径仍然是“系统无法找到指定的引用”,要解决很简单——选中该引用,修改其属性的特定版本为True即可,同时设置复制本地属性为True。
图3
![](http://b.hiphotos.baidu.com/album/pic/item/37d12f2eb9389b504e4c577a8435e5dde7116e62.jpg)
至此程序应该是可以成功运行了!生成程序后,我们要把Release文件夹中所有文件进行发布。记着一定要祭出.Net Reflector,挨个程序集看看是否有依赖项是3.0以上的,若有则Copy之。但是这样能在只有2.0的机器上顺利运行吗?未必!
第二步:这次来到只有2.0的机器上,运行程序,会出现一堆万恶的E文。
图4
![](http://a.hiphotos.baidu.com/album/pic/item/aec379310a55b319938d355d42a98226cffc17a5.jpg)
大意是缺少配置文件之类的,其中有"ServiceModelReg.exe -i"字样。
那就依计行事——
在C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation中找到并执行
ServiceModelReg.exe -i
图5
![](http://f.hiphotos.baidu.com/album/pic/item/91529822720e0cf36a80f9d30b46f21fbe09aaa7.jpg)
然后再次运行程序,大功告成。
图6
![](http://c.hiphotos.baidu.com/album/pic/item/7c1ed21b0ef41bd5ff225fdc50da81cb39db3da0.jpg)
重要声明:所谓的.net FrameWork 2.0务必是2.0 SP2。当时笔者在此纠结了很长时间,后来通过VS2008环境和纯2.0环境的比对才发现问题所在。VS2008中的2.0实际已经是SP2了(详细版本号是2.0.50727.3053),而我安装的测试环境只是2.0(详细版本号是2.0.50727.42),差别还是比较大的。
备注:VS2008和纯.NET 2.0的系统均为XP SP2,其他环境暂时没测试。这种方法ms也可以用到其他3.0以上的其他扩展程序集,比如3.5的Linq。
总结:
.net FrameWork 2.0库运行WCF客户端程序以下四要素:
1、客户端的.net FrameWork 2.0库必须为SP2,看详细版本号(SP2为2.0.50727.3053)。
2、通过浏览引用System.ServiceModel.dll,修改其属性中的特定版本为True,同时设置复制本地为True。
3、附带必要的程序集——
SMdiagnostics.dll
System.IdentityModel.dll
System.Runtime.Serialization.dll
System.ServiceModel.dll
System.ServiceModel.Install.dll (ServiceModelReg -i ServiceModel注册必要程序集)
ServiceModelReg.exe (ServiceModelReg -i 安装程序)
4、ServiceModelReg -i 进行注册
相关文章推荐
- void*指针
- 如何在Android Studio上使用Github
- 比较好用的php函数
- 11gR2 RAC手动添加VIP
- Java enum的用法详解
- android 后台报错com.lidroid.xutils.exception.HttpException: Not Found-----Not Found 解决办法
- 全表扫描是指整个表的数据检索一次
- Android 下拉刷新框架实现
- Android活动Acitivity启动模式之standard
- Memcached常用操作
- 提高SQL的查询效率
- Javascript的DOM操作 - 你真的了解吗?
- jquery选择器总结
- jdk 动态代理 数据连接池
- Java线程(二):线程同步synchronized和volatile
- LIZ文件格式加密分析
- LIZ文件格式加密分析
- 规划上海地铁一条线路最佳的列车数量
- javaWeb Cache技术――OSCache(转-全)
- VB.Net学习笔记(八)