2014-12-19 177 views
3

當運行我的.NET項目中,我得到以下運行時錯誤:NuGet包GAC依賴

Could not load file or assembly 'Microsoft.WindowsAzure.ServiceRuntime, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 

從我個人理解,Microsoft.WindowsAzure.ServiceRuntime是GAC依賴和不提供的NuGet。

我的.NET項目引用了Azure SDK 2.5中ServiceRuntime的2.5.0.0。異常的堆棧跟蹤顯示我們的一個自定義NuGet包引用了2.4.0.0。

當在NuGet包的依賴關係來看,它並不顯示ServiceRuntime,我以爲是因爲它是一個GAC引用(東西它的NuGet無法解析):

NuGet Depedencies

我發現,通過加入以下web.config變化,現在它工作:

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.WindowsAzure.ServiceRuntime" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0" /> 
</dependentAssembly> 

我會認爲這只是工作,如果2.5.0.0與2.4.0.0規範向後兼容。

問題:如果它是不向後兼容

  • 會發生什麼?
  • 爲什麼不是Microsoft.WindowsAzure.ServiceRuntime的NuGet包?

回答

3

雖然回答這個問題可能遲了一點,但總比遲到好得多。以下是我的看法:

如果它不向後兼容會發生什麼?

您的解決方案會中斷,儘管下一版本的程序集不是向後兼容的,但您可以運行任何舊.net程序,使用較新版本的.Net/CLR,atmost會顯示棄用消息,它只有在相當長的時間後才停止支持,因爲在這種情況下。只有向下兼容時,程序集纔是下一個版本,否則就是新程序集。

爲什麼Microsoft.WindowsAzure.ServiceRuntime不是一個NuGet包?

首先了解Nuget here存在的原因,實質上它只是針對第三方庫/擴展。它不適用於核心MS/.Net框架庫,其源代碼不可用並且不能由外部開發人員修改。

希望這在一定程度上有所幫助。

+1

Nuget絕對不只適用於第三方庫。微軟甚至在nuget上有自己的feed - https://www.nuget.org/profiles/microsoft - 目前包含超過1100個軟件包。 – 2014-12-22 10:32:15

+0

MS不通過Nuget提供核心.Net庫,鏈接中提到的庫是用於附加功能的可選庫,在許多情況下,它們具有第三方競爭對手或者可以覆蓋,以修改當前的實現 – 2014-12-22 10:37:24

+0

在我提到的鏈接,你會看到很多可以被認爲是核心的庫。 - 例如MVC,WebApi,OData,Razor,Owin和EntityFramework。但是你確定對於某些事情是正確的,我們不幸的是仍然需要安裝SDK的++ – 2014-12-23 12:58:23