在Silverlight和“普通的vanilla” .Net之间共享程序集

6
我正在使用一些通用类作为数据容器,并将它们用于与WCF服务之间的数据传递。由于WCF在客户端将通用名称转换为类似于"ListOfBlah231546797646"的类,我正在添加对真实程序集的引用作为“已知类型”。
Silverlight需要使用这些服务,但只能引用“Silverlight程序集”。我已经将这些类移动到它们自己的“Silverlight程序集”中,并可以从Silverlight引用它们,但当服务运行时,我会收到关于System.Runtime.Serialization程序集“找不到引用程序集”的错误。
事实证明,Silverlight有它自己的一组二进制文件,所有标记为版本2.0.5.0。这些不在服务的GAC中,因此会抛出异常。
由于这个问题,我无法从我的服务代码中引用我的“Silverlight程序集”。有没有办法解决这个问题,使得两种类型在序列化时可以跨兼容?
这个问题很相似,但是没有一个答案能够帮助我。你有什么想法吗? 类似的问题
3个回答

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在另一个项目中更新。

这确实可行,但是WCF无法识别泛型类,并且KnownType属性也无法起作用。我已经找到了另一种解决问题的方法,但你的答案非常聪明,适用于想要共享与WCF不太相关的代码的人们。 - Matthew Timbs

1

我过去有两种方法来实现这个。

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

第二种是,在Silverlight和.NET 3.5 CLR中存储两份类的副本。然后确保DataContract名称和命名空间匹配。如果在Silverlight中添加了ServiceReference,那么在资源管理器视图中查看ServiceReference文件夹并查看Reference.cs文件,您将看到生成的类并可以复制它们。


这实际上行不通,因为我的类是泛型的。而不是 MyClass<T>,我得到的是 MyClassOfType12315125 这样的东西。我认为第二个选项也行不通,因为序列化的方式不同。我不相信 .net 会认为这些类型是相同的。 - Matthew Timbs
你能添加一个 ServiceReference 并检查输出吗? - bendewey
什么意思?生成的代理类没有使用泛型,并且命名非常糟糕,就像我给出的例子一样。 - Matthew Timbs

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"];

这个例子来自这个MSDN示例

这种方法的好处是,您可以在Silverlight中使用Linq支持,并且您的Ajax客户端也可以使用它。 它比将真实对象暴露给运行在客户端上的Silverlight应用程序更安全。


如果你序列化一个 List<MyObject>,你将得到一个 MyObject 数组的 JSON。因此,序列化器支持泛型列表,但我不确定它如何处理序列化 MyGenericClass<MyType>。 - Dan
我可以通过标准的SOAP服务引用获得类似的东西。但我不喜欢它创建一个丑陋的装饰名称,也不能使用我的真实类中的任何逻辑。我知道这不是“真正”的SOA,但我拥有服务器和客户端,并试图找出一种共享代码的方法。 - Matthew Timbs
另一个解决方案可能是Rocky Lhotka的CLSA.Net for silverlight。您将不得不采用该框架,但它可能会有所帮助:http://www.lhotka.net/weblog/CategoryView,category,Silverlight.aspx无论您选择哪种解决方案,都需要认真研究!;-) - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接