ServiceDescriptionImporter 类在 vs2010 无法引用的解决方法

本文详细介绍了在使用Visual Studio 2010 with SP1开发C#控制台程序时,遇到未找到命名空间ServiceDescriptionImporter的问题。通过将项目属性中的目标框架从.NET4.0frameworkclientprofile更改为.NET4.0framework,成功解决了此问题,并提供了详细的解决步骤和参考链接。

当我用 VS2010 with SP1 编写 C# 控制台程序时,有这样一句:

using System.Web.Services;
using System.Web.Services.Description;
// ...
ServiceDescription sdServiceDescription = ServiceDescription.Read(smWebStream);
ServiceDescriptionImporter sdiDescriptionImporter = new ServiceDescriptionImporter();
sdiDescriptionImporter.AddServiceDescription(sdServiceDescription, "", "");

总是被 IDE 提示说 “未找到命名空间 ServiceDescriptionImporter”,检查原因,我已经添加了System.Web.Service,问题仍未解决。

后来才发现是 VS2010 默认的项目属性引起的。


解决办法是:项目属性 -> 应用程序 -> 目标框架,把默认的 “.net 4.0 framework client profile” 改为 “.net 4.0 framework” 即可。



注:参考 http://tech.net-tong.com/04/0009/20111111/24203_1/


public static object InvokeWebService(string strUrl, string strMethodname, object[] objArgs) { //这里的namespace是需引用的webservices的命名空间,我没有改过,也可以使用。也可以加一个参数从外面传进来。 //string @strNameSpace = "client"; try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(strUrl);// + "?WSDL" ServiceDescription sd = ServiceDescription.Read(stream); string strClassName = sd.Services[0].Name; ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(); //生成客户端代理代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); //设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false;//动态编译后的程序集不生成可执行文件 cplist.GenerateInMemory = true;//动态编译后的程序集只存在于内存中,不在硬盘的文件上 cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理 CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(strClassName, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(strMethodname); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了,method.Invoke(0,null)这里的null可以传调用方法需要的参数,string[]形式的 return mi.Invoke(obj, objArgs); } catch { return null; } } 这段代码中的sb.Append(ce.ToString());报错,提示未能打开元数据文件“d:\Projects\ALLHJ_VS12\Project1\HY.Shell\bin\Debug\System.EnterpriseServices.dll”--“导入程序集“d:\Projects\ALLHJ_VS12\Project1\HY.Shell\bin\Debug\System.EnterpriseServices.dll”的模块“System.EnterpriseServices.Wrapper.dll”时出错 -- 系统找不到指定的文件。 ”
最新发布
09-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值