代码之家  ›  专栏  ›  技术社区  ›  Zak

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

  •  4
  • Zak  · 技术社区  · 15 年前

    我有一个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。

    有没有一种方法可以引用两个版本而不得到错误?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Andy Britcliffe    15 年前

    如果您有公共库的源代码,那么最好的方法是有3个项目,一个用于SL,一个用于WCF,一个用于共享库源代码。然后,可以使用Visual Studio的“添加为链接”选项引用SL和WCF项目中共享库中的源文件。然后可以根据正确的.NET库版本编译源文件。这方面的好处在于源文件是引用副本,当您对共享库进行更改时,SL和WCF项目都会得到更新,而不会出现任何重复。

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

    高温高压

        2
  •  2
  •   JaredPar    15 年前

    不,这在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,以使其能够进行功能性加载。然而,当程序执行时,这几乎肯定会导致更严重的错误。