2009-10-12 115 views
4

我有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

回答

2

如果您擁有公共庫的源代碼,那麼最好的方法是擁有3個項目,一個用於SL,一個用於WCF,另一個用於共享庫源。然後,您可以使用Visual Studio的添加爲鏈接選項,從SL和WCF項目中的共享庫中引用源文件。然後可以根據正確的.Net庫版本編譯源文件。關於這一點的好處是由於源代碼是參考副本,所以當您更改共享庫時,SL和WCF項目都會更新而不會有任何重複。

我們一直在我們的產品中使用這種方法,它工作得很好。

HTH

+0

謝謝安迪,這解決了我們的問題。 – Zak 2009-10-12 18:01:13

2

不支持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

相關問題