我正在使用一些泛型类作为数据容器,并使用它们来传递数据到wcf服务和从wcf服务传递数据。由于WCF将客户端的通用名称变为名为“ListOfBlah231546797646”的类,我将实际程序集的引用添加为“KnownType”。
Silverlight需要使用这些服务,但只能引用“silverlight程序集”。我已经将类移动到他们自己的“silverlight程序集”并且可以从silverlight引用它们,但是当服务运行时,我在System.Runtime.Serialization程序集上得到“无法找到引用的程序集”错误。
事实证明,Silverlight拥有自己的二进制文件集,所有二进制文件都标记为版本2.0.5.0。这些不在服务的GAC中,因此抛出异常。
因此,我不能从我的服务代码中引用我的“Silverlight程序集”。有什么办法可以解决这个问题,让两种风格在序列化时交叉兼容吗?
这个问题很相似,但没有一个答案有帮助。有任何想法吗? similar question
答案 0 :(得分:3)
我在Silverlight和普通CLR之间共享代码的方式是在C#项目中使用“添加为链接”功能。所以最终看起来像这样:
| SilverlightLib
| File1.cs
| File2.cs
| ClrLib
| File1.cs <as link>
| File2.cs <as link>
然后VS工作正常,两组代码都被编译。烦人的部分是Silverlight框架没有排队的地方。 (WCF有一些在SL中不存在的部分。)在这种情况下,您需要使用预处理器“#if SILVERLIGHT”来使代码成为两个平台的目标。
到目前为止,这种方法运作良好。这样,我可以编写代码,使用VSTS进行测试,但仍然可以在同一来源的SL上工作。一些提示:
答案 1 :(得分:1)
我过去有两种方法可以做到这一点。
第一也是最简单的。将WCF服务作为ServiceReference添加到Silverlight中。这将负责重新生成所有类库并在需要时刷新它们。
其次,存储两个类的副本,一个在silverlight中,另一个在.net 3.5 clr中。然后确保DataContract名称和命名空间匹配。如果在Silverlight中添加ServiceReference,那么在资源管理器中查看ServiceReference文件夹并查看Reference.cs文件,您将看到生成的类并可以复制它们。
答案 2 :(得分:0)
不确定您的方案是否可行,但是您是否考虑过将序列化为Json的对象提供给您的Silverlight客户端?然后在您的silverlight应用程序中,您可以使用Silverlight中的JsonObject。这样您就可以避免在silverlight应用程序中使用另一组模型对象。
JsonObject user = (JsonObject)JsonObject.Load(responseStream);
bool isMember = user["IsMember"];
string name = user["Name"];
int age = user["Age"];
示例来自this msdn sample
这种方法的好处还在于你在silverlight中拥有linq支持,这也可以被你的ajax客户端使用。它比将您的真实对象暴露给客户端上运行的silverlight应用程序更安全。