在一个应用程序中使用不同版本的DLL

4
我有一个Silverlight类库,被Silverlight应用程序和常规的C# WCF服务使用。Silverlight应用程序调用WCF服务来读写一些数据。它们都使用公共库来操作传递的数据。所有内容都可以编译通过,但是当我们运行应用程序时,当调用Silverlight库时,WebService抛出以下错误:“无法加载文件或程序集'System.Xml,Version=2.0.5.0,Culture=neutral, PublicKeyToken=7cec85d7bea7798e'或其某个依赖项。系统找不到指定的文件。”这是因为Silverlight类库引用了System.Xml的v2.0.5版本,而WCF服务引用了System.Xml的v3.5版本。是否有一种方法可以引用两个版本而不会出现错误?

这没有太多意义。WCF 运行在不同于 Silverlight 的运行时引擎上。 - Jeff Yates
此外,Silverlight 运行在客户端,而 WCF 运行在服务器端。我认为这个错误与 WCF 服务器部分有关,因此与 Silverlight 无关,除非您的服务契约恰好保留了无法在 WCF 中重新创建的强类型值或一组值。在这种情况下,您应该更改契约以包含在服务两侧都支持的类型。 - Jeff Yates
2个回答

2

CLR不支持此功能(除非进行大量的黑客攻击)。 原因是CLR的根本限制。 即在CLR实例中只能加载一个mscorlib。

如果您有2个版本的System.Xml.dll,则将引用2个不同版本的mscorlib。 对于Silverlight和非Silverlight项目尤其如此,它们具有根本不同的mscorlib和BCL DLL。 因此,当您尝试加载第二个System.Xml DLL时,它最终将尝试加载不同的mscorlib,这肯定会失败。

我添加“without a good deal of hacking”警告的原因是绑定重定向。 我相信您可以在app.config中插入一些美妙的绑定魔法,将Silverlight System.Xml重定向到完整的System.Xml以使其功能正常加载。 但是,随着程序执行,这几乎肯定会导致更糟糕的错误。


这个不是要在.NET 4.0中发布吗? - ParmesanCodice
这没有意义。Silverlight在Silverlight插件(moonlight)中在客户端上运行,而WCF服务在服务器上执行。这里没有重用相同的CLR。如果有什么问题,这是一个服务契约和数据类型编组问题。 - Jeff Yates
@Jeff,这不合理吗?用户说他们在尝试加载第二个System.Xml到他们的进程中时遇到了错误,并且版本号清楚地表明它是Silverlight版本。我同意情况很奇怪,但我必须根据OP所描述的症状进行分析。我相信我对OP所描述的情况的分析是100%正确的。不确定为什么我在这里得到了负投票。 - JaredPar
+1。这个答案完美地解决了这个问题。我见过的唯一解决方案是将代码编译两次。一次使用一组SL引用来生成可供客户端使用的可下载程序集,另一次使用标准的引用集合来供服务器使用。 - AnthonyWJones
@Jeff,别担心。我今天已经达到了声望上限,所以这不会有任何影响。 - JaredPar
显示剩余2条评论

2
如果你已经有了通用库的源代码,最佳的方法是创建三个项目,一个用于Silverlight,一个用于WCF,另一个用于共享库源代码。然后,你可以使用Visual Studio的“添加链接”选项在SL和WCF项目中引用共享库中的源文件。源文件可以根据正确的.NET库版本进行编译。这样做的好处是,由于源文件是引用副本,在更改共享库时,SL和WCF项目都会得到更新,而不会有任何重复。
我们在产品中使用了这种方法,效果非常好。
希望这能帮到你。

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