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

问题描述:

我有Silverlight应用程序和常规C#WCF服务正在使用的Silverlight类库。在一个应用程序中使用不同版本的DLL

Silverlight应用程序调用WCF服务来读取/写入一些数据。他们都使用公共库来操纵传递的数据。

一切编译罚款,但是当我们运行应用程序,web服务抛出的时候调用到Silverlight库是由以下错误:

“无法加载文件或程序集的System.Xml,版本= 2.0 .5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'或其依赖项之一,系统找不到指定的文件。“

这是因为silverlight类库引用了System.Xml的v2.0.5,但WCF服务引用了System.Xml的v3.5。

有没有一种方法可以引用这两个版本并且不会出错?

+0

这没什么意义。 WCF在与Silverlight不同的运行时引擎上运行。 – 2009-10-12 16:04:46

+0

此外,Silverlight在客户端和服务器上的WCF上运行。我会假设这个错误与WCF服务器部分相关,因此与Silverlight无关,除非您的服务契约碰巧持续存在强类型值或无法在WCF中重新创建的一组值。在这种情况下,您应该将合同更改为包含服务两端正确支持的类型。 – 2009-10-12 16:06:40

如果您拥有公共库的源代码,那么最好的方法是拥有3个项目,一个用于SL,一个用于WCF,另一个用于共享库源。然后,您可以使用Visual Studio的添加为链接选项,从SL和WCF项目中的共享库中引用源文件。然后可以根据正确的.Net库版本编译源文件。关于这一点的好处是由于源代码是参考副本,所以当您更改共享库时,SL和WCF项目都会更新而不会有任何重复。

我们一直在我们的产品中使用这种方法,它工作得很好。

HTH

+0

谢谢安迪,这解决了我们的问题。 – Zak 2009-10-12 18:01:13

不支持CLR(没有大量的黑客行为)。原因是因为CLR的根本限制。也就是说,只有一个mscorlib可以加载到CLR的实例中。

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

我之所以添加“没有很好的黑客行为”警告是因为绑定重定向。我确定有一些可爱的绑定魔法可以插入到app.config中,这会将Silverlight System.Xml重定向到完整的System.Xml以使其在功能上加载。然而,随着程序的执行,这几乎肯定会导致更糟糕的错误。

+0

这不是.NET 4.0吗? – ParmesanCodice 2009-10-12 16:06:33

+0

这没有意义。 Silverlight在Silverlight插件(月光)中的客户端上运行,而WCF服务在服务器上执行。这里没有重复使用相同的CLR。如果有的话,这是一个服务合同和数据类型编组问题。 – 2009-10-12 16:07:36

+0

@Jeff,这没有意义吗?用户说他们尝试加载第二个系统时出错。Xml进入他们的流程,版本号清楚地表明它是Silverlight版本。我同意这种情况很奇怪,但我必须与OP所说的症状是一致的。我相信我对OP所描述场景的分析是100%正确的。不知道为什么我在这里得到了低估。 – JaredPar 2009-10-12 16:10:36