【问题标题】:Sharing assembiles between Silverlight and "plain vanilla" .Net在 Silverlight 和“plain vanilla”.Net 之间共享程序集
【发布时间】:2009-03-20 19:45:55
【问题描述】:

我使用一些通用类作为数据容器,并使用它们将数据传入和传出 wcf 服务。由于 WCF 将客户端上的通用名称修改为名为“ListOfBlah231546797646”之类的类的方式,我将添加对真实程序集的引用作为“KnownType”。

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

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

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

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

【问题讨论】:

    标签: .net wcf silverlight


    【解决方案1】:

    我在 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 才能在其他项目中更新。

    【讨论】:

    • 这确实有效,但是,WCF 无法识别泛型类,并且 KnownType 属性将不起作用。我找到了另一种解决问题的方法,但您的回答非常聪明,适用于希望共享与 WCF 不那么交织的代码的人。
    【解决方案2】:

    我过去有两种方法。

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

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

    【讨论】:

    • 这实际上行不通,因为我的类是泛型。而不是我的 MyClass 我得到类似 MyClassOfType12315125 的东西。由于序列化的工作方式,我认为第二个选项也不会起作用。我不相信 .net 会认为类型相同。
    • 你能添加一个ServiceReference并检查输出吗?
    • 什么意思?生成的代理类没有使用泛型,而且名字很糟糕,就像我给出的例子一样。
    【解决方案3】:

    不确定在您的场景中是否可行,但您是否考虑过将序列化为 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 应用程序更安全。

    【讨论】:

    • 如果你序列化一个 List 你会得到一个 JSON 格式的 MyObject 数组。所以序列化程序支持泛型列表,我不确定它将如何处理序列化 MyGenericClass.
    • 我可以通过标准的肥皂服务参考获得类似的东西。我不喜欢它如何创建一个丑陋的装饰名称,也不能在我的真实课堂中使用任何逻辑。我知道这不是“真正的”SOA,但我同时拥有服务器和客户端,并试图找出一种共享代码的方法
    • 另一种解决方案可能是 Rocky Lhotka 的 CLSA.Net for silverlight。您将不得不采用该框架,但它可能会有所帮助:lhotka.net/weblog/CategoryView,category,Silverlight.aspx 无论您选择哪种解决方案,您都必须做好功课! ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多