我创建了3个项目:类库(由以下两个引用(,Web服务和客户端应用程序。在客户端应用程序中,我尝试从Web服务获取"共享类型"的对象时,我收到错误Cannot implicitly convert type 'ClientProject.ServiceProject.AB' to 'ClassLibrary.AB'
。我认为这是我使用 DataContract 的方式存在问题,但我尝试了几种方法,它仍然给出相同的结果。你能给我一些指示吗,我做错了什么?
类库 AB 类:
using System;
using System.Runtime.Serialization;
namespace ClassLibrary
{
[Serializable]
[DataContract(Name = "AB", Namespace = "ClassLibrary")]
public class AB
{
[DataMember(Name = "a")]
private int a;
[DataMember(Name = "b")]
private byte[] b;
<some_more_methods_here>
}
}
网络服务方法:
using ClassLibrary;
[...]
[WebMethod]
public AB calledMethod(byte[] x)
{
int a = [...]
byte[] b = [...]
AB ab = new AB(a, b);
return ab;
}
失败的客户端代码:
using ClassLibrary;
[...]
byte[] x = [...]
var serviceProjectSoapClient = new ServiceProject.ServiceProjectSoapClient();
AB ab = new AB();
ab = serviceProjectSoapClient.calledMethod(x);
编辑:
由于对我是否使用共享项目或类库有一些担忧,因此这里有一些澄清。
我尝试了以下方法:1(创建了"类库"项目;2(建造它;3(从服务器和客户端应用程序引用了它的*.dll(两者都指向同一位置的完全相同的*.dll文件,当我检查两个项目中的类型时,两者都显示完全相同的元数据(。
我找到了它为什么会这样运行:我向客户端应用程序项目添加了服务引用以与 Web 服务进行通信。在这种情况下,此类引用的工作方式与任何其他 *.dll 引用完全相同。问题是尽管Service方法返回ClassLibrary.AB
对象,编译器没有考虑命名空间并期望AB
对象,由于对Web服务的引用,期望ServiceProject.AB
并最终使用CientProject中的默认命名空间 -ClientProject.ServiceProject.AB
。