2014-01-22 45 views
1

我在C#/ Azure應用程序中追蹤錯誤彙編參考問題的原因非常困難。我所尋找的並不是某個人告訴我對我的問題的確切解決方案,而是如何找到系統試圖加載的組件以及如何找出爲什麼要這樣做。如何在C#中找到錯誤的彙編參考號

當我們升級Azure工具時,問題出現了。真奇怪的是,當我試圖通過實體框架調用數據庫函數時,錯誤才發生(從我所知道的情況)。 EF會執行所有這些隱式的程序集加載,以及它如何變得困惑,並嘗試加載Microsoft.ServiceBus 1.8.0.0(或者正在查找該程序集)而不是版本2.2.0.0。

我們正在使用實體框架4.0。而且,僅供參考,我們可以調用存儲過程並完成其他類型的查詢。只有db函數調用會導致這個特定的問題。

我已經通過我的應用程序搜索到了高和低,並且可以在任何地方找到沒有提及1.8.0.0和沒有迷路1.8.0.0 dll的地方。我們可能會過時引用某些第三方庫,這些庫保留對1.8.0.0的引用,但我認爲這不太可能。

儘管如此,我的目標不是讓別人告訴我X是我的問題,而是讓我知道如何偵察實體框架並找出它試圖加載該程序集的原因以及它是什麼希望能夠找到它的實際發現。

這是我的完整堆棧跟蹤。

無法加載文件或程序集「Microsoft.ServiceBus,Version = 1.8.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35」或其某個依賴項。定位的程序集清單定義與程序集引用不匹配。 (從HRESULT異常:0x80131040) 在System.Reflection.RuntimeAssembly._nLoad(的AssemblyName文件名,字符串的代碼庫,證據assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark&stackMark,IntPtr的pPrivHostBinder,布爾throwOnFileNotFound,布爾forIntrospection,布爾suppressSecurityChecks) 在系統。 Reflection.RuntimeAssembly.InternalLoadAssemblyName(的AssemblyName assemblyRef,證據assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark&stackMark,IntPtr的pPrivHostBinder,布爾throwOnFileNotFound,布爾forIntrospection,布爾suppressSecurityChecks) 在System.Reflection.Assembly.Load(的AssemblyName assemblyRef) 在System.Data.Metadata .Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName程序集名稱) at System.Da ta.Metadata.Edm.MetadataAssemblyHelper.d__0.MoveNext() at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly,Boolean loadReferencedAssemblies,ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly() Assembly Assembly,Boolean loadReferencedAssemblies,ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly,Boolean loadReferencedAssemblies,ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly,Boolean LoadReferencedAssemblies,ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly,Boolean loadReferencedAssemblies,KnownAssembliesSet knownAssemblies,EdmItemCollection edmItemCollection,Acti on`1 logLoadMessage,對象&loaderCookie,Dictionary`2&typesInLoading,List`1&錯誤) 在System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection,裝配組件,布爾loadReferencedAssemblies,EdmItemCollection edmItemCollection,Action`1 logLoadMessage) 在System.Data.Metadata.Edm.ObjectItemCollection。ImplicitLoadAllReferencedAssemblies(Assembly assembly,EdmItemCollection edmItemCollection) at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type type,Assembly callingAssembly) at System.Data.Objects.ObjectContext.CreateQuery [T](String queryString,ObjectParameter [] parameters ) at c:\ Users \ RMacgrogan \ dev \ flightbridge \ BaseOps \ trunk \ FB中的Pallas.FlightBridge.Services.Internal.Data.Model.FlightBridgeDatabaseContext.TripPermissions(Nullable`1 companyPersonId)版本7.8 \ code \ InternalServices \ Data \ Model \ FlightBridgeDataModel.Designer.cs:line 3778 at c:\ Users \ RMacgrogan \ dev \ flightbridge \ BaseOps \ trunk \中的Pallas.FlightBridge.Services.Internal.Data.Repository.TripRepository.GetTripAndOrdersAndTravelers(Int32 tripId,Int32 companyPersonId) FB版本7.8 \ code \ InternalServices \ Data \ Repository \ TripRepository.cs:line 50
+0

聽起來像你需要綁定重定向。 – danludwig

+0

無法加載文件或程序集「Microsoft.ServiceBus,版本= 1.8.0.0」。檢查你的參考這一個。 – Tico

+0

Tico我們在我們的代碼庫的任何地方都沒有任何對Service Bus 1.8.0.0的引用,我可以找到它們。我到處搜索。如果您有關於如何驗證我們確實沒有引用1.8的建議,我很樂意聽到它。 –

回答

3

蔚藍工具升級後,我們遇到了類似問題。與我們的,它正在尋找不同版本的Microsoft.WindowsAzure.Storage。這爲我們修復了它。這是從一個工人的角色一個app.config,但同樣的部分也是一個web.config有效:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

那麼對你來說,這似乎將需要在有問題的角色的配置類似的綁定重定向文件。類似這樣的:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="Microsoft.ServiceBus" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

爲什麼會發生這種情況?

當Microsoft構建像EF,WindowsAzure Storage等這些庫時,它們依賴於其他庫。在構建dll時,他們可能已經依賴於像Microsoft.ServiceBus這樣的庫的1.8版本。通常,這些依賴關係是.NET框架的一部分,或者類似於Azure SDK。

後來,他們推出了這些庫的更新版本。您的項目可能依賴於較新版本的.NET框架,Azure SDK或特定庫,其版本與原始庫的依賴關係不同 - 比如2.2而不是1.8。有問題的庫(EF)會查找針對其編譯的版本(1.8),並且即使您有更新版本的dll(2.2),也會引發異常,這些版本可以很好地工作。解決方案是使用綁定重定向來配置您的應用程序,以告訴依賴項「嘿,可以使用此更新版本」。

事實上,如果您有多項目解決方案,nuget在您安裝新軟件包時已開始將這些綁定重定向放入其他項目中。它基本上講述瞭解決方案中的所有項目,「嘿,如果你正在使用這個庫,現在解決方案中有一個新版本,請使用這個新版本,而不是之前使用的任何以前的版本。」

+0

感謝您的回覆,danludwig。我應該在我原來的帖子中提到,我們已經在我們的應用配置中爲服務總線和存儲提供了這些指令。我們正在使用NuGet來管理大部分(但不是全部)我們的軟件包。 EF 4是我們不使用NuGet的。我會看看是否可以將我們的EF4轉移到NuGet,如果這有幫助的話。 –