类型“ IUnityContainer”在未被引用的程序集中定义

29

我刚刚通过 nuget 把我的 ASP.NET MVC/WebApi 项目从 Microsoft.Practices.Unity 3.5.1404 升级到了 3.5.1406 版本。然后,我遇到了这个编译错误:

Error CS0012:类型 'IUnityContainer' 在未被引用的程序集中定义。您必须添加对程序集 'Microsoft.Practices.Unity,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35' 的引用。

出现在如下行:

GlobalConfiguration.Configuration.DependencyResolver = 
    new Unity.WebApi.UnityDependencyResolver(container);

当然,我不是指3.0.0.0,而是3.5.1.0。因此,我的假设是Unity.WebApi程序集已经针对较早版本的Microsoft.Practices.Unity程序集进行了编译。理论上,你可以通过程序集重定向来解决这个问题,像这样:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.5.1.0" newVersion="3.5.1.0" />
  </dependentAssembly>

然而,似乎那并不起作用。

有什么建议吗?

8个回答

30

如何从Unity 3.5.1升级到4.0.1的更多更新的答案可能会是这样:

类型'IUnityContainer'在未引用的程序集中定义。您必须添加对程序集 'Microsoft.Practices.Unity,Version=3.5.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35'的引用。

可以通过Package Manager控制台或NuGet进行操作:

  • 卸载Unity.Mvc4
  • 卸载Unity.WebAPI
  • Update-Package Unity
  • Install-Package Unity.Mvc(注意:这次包名称中没有数字)
  • Install-Package Unity.AspNet.WebApi

代码:

  • 将Bootstrapper.cs中的container.RegisterTypes复制到App_Start/UnityConfig.cs
  • 从项目中排除Bootstrapper.cs
  • 构建和运行

这就是帮助了我。谢谢。 - Nikhil Agrawal
1
@Rob Koch 你救了我的一天 :) 非常感谢 - Shailesh Chaudhary

12

这可能现在已经多余了,但问题显然与Unity 3.5.1406有关,因为该版本被撤下,并替换为Unity 4.0。我还替换了旧的、显然不受支持的Unity.WebApi库,该库已经多年没有更新,改为使用新的、显然得到支持的Unity.AspNet.WebApi库。在NuGet中进行搜索有一点棘手,“Unity WebApi”搜索会将旧库放在列表顶部,把新库隐藏在第一页底部以下。

在这些变更之间,已经修复了所有我发现的问题。


1
请按照Rob在以下答案中给出的确切步骤,将Unity.Mvc4替换为Unity.Mvc。https://dev59.com/OFwY5IYBdhLWcg3wNFhY#35043239 - Nikhil Agrawal

8

在运行全局 update-package 时,我遇到了这个问题。

通过 install-package Unity -version 3.5.1404 回滚Unity版本解决了该问题。


1
经过很多的努力,我终于得到了精确的解决方案,感谢 user326608 的帮助。 - Ajay

6

你需要确保升级到Unity.AspNet.WebApi版本3.5.1406,而不仅仅是Unity。如果这样做,错误应该会消失。


你说得对,那应该解决了。但似乎并没有。我使用的是旧版(已弃用?)Unity.WebApi项目,而不是更新的Unity.AspNet.WebApi项目。但即使更新到正确的项目后,我仍然收到错误信息。或类似的错误:现在它抱怨需要3.5.0.0版本。我还在引用Microsoft.Practices.Unity.Mvc程序集中的类时遇到相同的错误。 - Ken Smith
1
Unity.WebApi是一个开源项目,允许在MVC项目中集成Unity IOC。然而,自2013年以来似乎没有更新,所以我可能会停止使用它。对于我的项目,我使用Microsoft的Unity/Unity.MVC,并与Unity.AspNet.WebApi一起使用。我似乎没有遇到任何安装问题。 - Leigh Shepperson
可能是包管理器/依赖项安装顺序的问题吗?也许可以在测试应用程序上尝试进行干净的安装? - Leigh Shepperson

3

今天早上我遇到了同样的问题,最后卸载了Unity v4.0和Unity.WebAPI。 安装了Unity v3.5.1405-prelease,然后重新安装了Unity.WebAPI。


哇,Unity 3.5.1406似乎已经从Nuget中删除了。有趣。我只看到3.5.1405-prelease和4.0。有趣。我将尝试使用各种4.x版本(所有相关的软件包现在都已更新到该版本),并查看会发生什么。 - Ken Smith
我的一个Web项目也是一样,我最终也取消了更新,等待微软的解决。 - Thorsten Westheider

3
装配绑定无法正常工作的原因可能是Microsoft.Practices.Unity的PublicKeyToken发生了变化。我读到在Unity.3.5.1404.0和Unity.4.0.0之间,PublicKeyToken从31bf3856ad364e35更改为6d32ff45e0ccc69f。也许在3.5.1406中已经更改了?请参见:https://github.com/unitycontainer/unity/issues/15

2

我刚刚找到了最新版本的Unity容器,也就是2013年4月发布的Unity 3,并将其添加到我的引用中。


欢迎来到 Stack Overflow!请务必引用重要链接的最相关部分,以防目标站点无法访问或永久离线。谢谢! - dferenc

-2

错误 1:类型“Microsoft.Practices.Unity.IUnityContainer”是在未被引用的程序集中定义的。您必须添加对程序集“Microsoft.Practices.Unity,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”的引用。

答案-仅针对此错误,只需打开->包管理器控制台并键入

PM> update-package


2
不要这样做。这是一个非常糟糕的想法。它会将解决方案中每个项目中的每个NuGet包更新到最新版本。对于一个大而复杂的解决方案,你不能只是更新每个NuGet包。除非你安排了几天(甚至几周)的测试时间。 - mhenry1384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接