起因:公司一个项目,采用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
将这些文件找出来,位置一般在两个文件夹里面,它们分别是“C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5”、“C:\WINDOWS\Microsoft.NET\Framework”。
把他们通过引用中的浏览加入到程序引用中(会弹出一警告窗口说该DLL或其依赖项之一要求的Framework版本比项目指定的版本高,忽略即可)。
图2
这时我们会发现该引用的路径仍然是“系统无法找到指定的引用”,要解决很简单——选中该引用,修改其属性的特定版本为True即可,同时设置复制本地属性为True。
图3
至此程序应该是可以成功运行了!生成程序后,我们要把Release文件夹中所有文件进行发布。记着一定要祭出.Net Reflector,挨个程序集看看是否有依赖项是3.0以上的,若有则Copy之。但是这样能在只有2.0的机器上顺利运行吗?未必!
第二步:这次来到只有2.0的机器上,运行程序,会出现一堆万恶的E文。
图4
大意是缺少配置文件之类的,其中有"ServiceModelReg.exe -i"字样。
那就依计行事——
在C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation中找到并执行
ServiceModelReg.exe -i
图5
然后再次运行程序,大功告成。
图6
重要声明:所谓的.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 进行注册