繁体   English   中英

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

[英]Using different versions of DLL in one application

我有一个Silverlight类库,Silverlight应用程序和常规C#WCF服务都在使用它。

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

一切都编译得很好,但是当我们运行应用程序时,webservice会在调用silverlight库时抛出以下错误:

“无法加载文件或程序集'System.Xml,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'或其中一个依赖项。系统找不到指定的文件。”

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

有没有办法可以引用这两个版本而不是错误?

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以使其在功能上加载。 然而,随着程序的执行,这几乎肯定会导致更糟糕的错误。

如果您拥有公共库的源代码,那么最好的方法是拥有3个项目,一个用于SL,一个用于WCF,另一个用于共享库源。 然后,您可以使用visual studio的add as link选项从SL和WCF项目中的共享库中引用源文件。 然后可以根据正确的.Net库版本编译源文件。 关于这一点的好处是由于源是引用副本,当您对共享库进行更改时,SL和WCF项目都会更新而不会重复。

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

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM