代码之家  ›  专栏  ›  技术社区  ›  Matthew Timbs

在Silverlight和“纯香草”.NET之间共享组合

  •  6
  • Matthew Timbs  · 技术社区  · 15 年前

    我使用一些通用类作为数据容器,并使用它们向WCF服务传递数据。由于wcf将客户端的通用名称管理为类似“listofblah231546797646”的类,因此我将向实际程序集添加一个“knownType”引用。

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

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

    因此,我无法从我的服务代码中引用“Silverlight程序集”。有没有什么方法可以解决这个问题,使这两种口味在序列化时可以交叉兼容?

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   MichaelGG    15 年前

    我在Silverlight和普通clr之间共享代码的方式是将“添加为链接”功能与C项目一起使用。结果是这样的:

    | SilverlightLib
    |   File1.cs
    |   File2.cs
    | ClrLib
    |   File1.cs <as link>
    |   File2.cs <as link>
    

    然后,VS工作正常,两组代码都被编译。令人恼火的部分是Silverlight框架没有对齐。(WCF有一些在SL中不存在的部分。)在这种情况下,您需要使用预处理器“if silverlight”使代码面向两个平台。

    到目前为止,这已经很有效了。通过这种方式,我可以编写代码,使用VST进行测试,但仍然可以从同一个源代码对SL进行测试。一些提示:

    • 总是从SL项目中进行编辑——这样,编辑器将限制为SL,以后您不会得到惊喜。
    • 有时必须关闭打开的文件,以便在另一个项目中更新IntelliSense。
        2
  •  1
  •   bendewey    15 年前

    我过去有两种方法可以做到这一点。

    第一个也是最简单的。将WCF服务作为ServiceReference添加到Silverlight中。这将负责重新生成所有类库,并在需要时刷新它们。

    其次,存储两个类的副本,一个在Silverlight中,一个在.NET3.5clr中。然后确保DataContract名称和命名空间匹配。如果在Silverlight中添加ServiceReference,那么在资源管理器中查看ServiceReference文件夹并查看reference.cs文件,您将看到生成的类并可以复制这些类。

        3
  •  0
  •   Dan    15 年前

    不确定在您的场景中是否可能,但您是否考虑将序列化为JSON的对象提供给您的Silverlight客户端?然后在Silverlight应用程序中,您可以使用 JsonObject 在Silverlight中。这样可以避免在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应用程序更安全。