1

我有一个使用 Unity 2.0 编写的应用程序,我正在尝试迁移到 2.1.505.0 版本。我将项目中的引用更改为指向与较新版本对应的DLL。当我构建解决方案时,它运行良好。但是,当我尝试运行应用程序时,它给了我一个 FileNotfoundException:

Stack Trace: 

[FileLoadException: Could not load file or assembly 'Microsoft.Practices.Unity, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]
   InsightsService.WebApi.WebApiApplication.Application_Start() in E:\tfs\DisplayApps\Services\InsightsBps\Dev\source\InsightsService.WebApi\Global.asax.cs:30

[HttpException (0x80004005): Could not load file or assembly 'Microsoft.Practices.Unity, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +12863325
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +175
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Could not load file or assembly 'Microsoft.Practices.Unity, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12880068
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12721257

我检查了 web.config 并找不到任何覆盖。我什至清理了解决方案并重建了它,但问题仍然存在。这里有什么问题?

4

2 回答 2

4

您可以使用 AssemblyBinding 确保在请求旧版本时使用新版本的 Unity。在以下配置文件中,它应该可以工作

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Practices.Unity"
                        publicKeyToken="31bf3856ad364e35"
                       />
      <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. -->
      <bindingRedirect oldVersion="2.0.414.0"
                       newVersion="2.1.505.0"/>
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Practices.Unity.Interception"
                        publicKeyToken="31bf3856ad364e35"
                       />
      <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. -->
      <bindingRedirect oldVersion="2.0.414.0"
                       newVersion="2.1.505.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

当我更新到新的 Unity 版本时,我遇到了同样的问题,但是我使用的企业库请求旧版本,因为企业库是针对版本 2.0.414.0 构建的。

于 2013-09-15T12:49:48.670 回答
1

您项目中的某些内容仍在引用旧的 DLL。

您是否尝试过打开 fuslogvw(有关说明,请参阅http://msdn.microsoft.com/en-us/library/e74a18c4.aspx)并查看它的日志记录?这通常会很快解决引用问题。

如果您发现引用是您无法修复的(例如,另一个您不拥有的 DLL),您可以查看设置绑定重定向。

于 2013-09-15T09:07:40.890 回答