2014-12-19 176 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