.NET 3.5项目中无命名空间的Schema/WSDL生成类在其他类库项目中的使用方法咨询
.NET 3.5项目中无命名空间的Schema/WSDL生成类在其他类库项目中的使用方法咨询
我明白你现在遇到的困扰——用xsd.exe和wsdl.exe生成的类没带命名空间,塞进类库项目后智能感知完全没反应,还不能用服务引用,确实头疼。结合.NET 3.5的特性,我给你几个可行的解决思路:
1. 手动添加命名空间(最推荐,彻底解决智能感知问题)
这是最稳妥的方案,毕竟全局命名空间的类型不仅智能感知不友好,还容易和其他类名冲突。操作起来也很简单:
- 打开生成的
klm.cs和abc.cs文件 - 把文件里的所有代码,包括那些带属性的部分类,整个包裹进一个自定义的命名空间里,比如:
namespace MyCompany.MyProject.GeneratedTypes { // 原文件里的所有内容,比如: [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] [System.SerializableAttribute()] public partial class KlmRootClass { private string someField; public string SomeProperty { get { return someField; } set { someField = value; } } } // 其他部分类、接口也都放在这个命名空间里 }
- 保存后,你的类库项目就能正确识别这些类型,智能感知也会正常弹出。之后在其他引用这个类库的项目里,只需要加一句
using MyCompany.MyProject.GeneratedTypes;,就能像用普通类一样调用了:
using MyCompany.MyProject.GeneratedTypes; public class MyBusinessClass { public void ProcessKlmData() { var klmData = new KlmRootClass(); klmData.SomeProperty = "测试数据"; // 后续逻辑... } }
如果之后需要重新生成klm.cs或abc.cs,记得重新套上这个命名空间就行——或者你可以写个简单的批处理脚本,每次生成后自动给文件加上命名空间,避免重复劳动。
2. 不改原文件,直接使用全局命名空间类型
如果因为某些原因不能修改生成的文件(比如怕后续重新生成覆盖),那可以利用C#的global::前缀来直接访问全局命名空间里的类型:
- 确保你的类库项目已经正确编译(没有编译错误)
- 在其他引用该类库的项目里,不需要添加
using,直接用global::前缀指定类名:
public class MyConsumerClass { public void UseAbcServiceType() { // 用global::前缀直接调用全局命名空间的类 var abcServiceClient = new global::AbcServiceInterfaceClient(); var result = abcServiceClient.SomeServiceMethod(); } }
不过这种方法的缺点是智能感知不会自动提示类名,你得手动记住或者从原文件里复制类名,体验不如加命名空间好。
为什么智能感知不显示?
Visual Studio的智能感知默认会优先展示当前命名空间、已引用命名空间里的类型,而全局命名空间的类型不会自动出现在提示列表里——这就是你加了文件但看不到提示的原因。给类加上命名空间后,类型就进入了明确的命名空间,智能感知就能正常识别了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

