在Silverlight和“普通香草”.Net之间共享集合

时间:2009-03-20 19:45:55

标签: .net wcf silverlight

我正在使用一些泛型类作为数据容器,并使用它们来传递数据到wcf服务和从wcf服务传递数据。由于WCF将客户端的通用名称变为名为“ListOfBlah231546797646”的类,我将实际程序集的引用添加为“KnownType”。

Silverlight需要使用这些服务,但只能引用“silverlight程序集”。我已经将类移动到他们自己的“silverlight程序集”并且可以从silverlight引用它们,但是当服务运行时,我在System.Runtime.Serialization程序集上得到“无法找到引用的程序集”错误。

事实证明,Silverlight拥有自己的二进制文件集,所有二进制文件都标记为版本2.0.5.0。这些不在服务的GAC中,因此抛出异常。

因此,我不能从我的服务代码中引用我的“Silverlight程序集”。有什么办法可以解决这个问题,让两种风格在序列化时交叉兼容吗?

这个问题很相似,但没有一个答案有帮助。有任何想法吗? similar question

3 个答案:

答案 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上工作。一些提示:

  • 始终从SL项目进行编辑 - 这样编辑器将限制为SL,以后您不会感到意外。
  • 有时你必须关闭已打开的文件,以便Intellisense在另一个项目中更新。

答案 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应用程序更安全。