缺少类型或命名空间,但正确添加引用

时间:2015-06-01 16:49:34

标签: c# .net visual-studio-2010 compilation compiler-errors

我们正在使用Visual Studio 2010,最近我们开始使用Google API。 由于不相关的原因,我们无法使用NuGet Package Manager来处理依赖项。相反,我们所做的是类似的事情。

我们在解决方案根目录中创建了一个libraries文件夹,因此我们所有的项目都会引用相同的库,几乎就是NuGet所做的,但没有包恢复或更新的简便性。

我们在项目中添加了以下参考资料:

Project References

与适当的依赖关系一起:

  • Microsoft.Bcl
  • Microsoft.Bcl.Async
  • Microsoft.Bcl.Build
  • Microsoft.Net.Http
  • Newtonsoft.Json
  • 的ZLib

但是,在尝试编译项目时,会出现以下错误:

  

类型或命名空间名称' Apis'名称空间中不存在Google' (你错过了一个程序集引用吗?)

奇怪的是,在我的构建失败后,IntelliSense无法检测到任何Apis命名空间,正如编译器告诉我的那样。

但是,如果我删除依赖项并再次添加它,那么它会找到它。 在此之后,如果我再次尝试编译项目,则该过程将失败,并且IntelliSense将(再次)无法找到Apis命名空间。

我们已经尝试删除临时文件,但没有运气。

可能会发生什么?

更新

我开始注意到一些警告:

  

主要参考" System.Net.Http.Extensions"无法解决,因为它对框架程序集具有间接依赖性; System.Net.Http,Version = 1.5.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"这在目前的目标框架中无法解决。 " .NETFramework,Version = 4.0"。要解决此问题,请删除引用" System.Net.Http.Extensions"或者将您的应用程序重新定位到包含" System.Net.Http,Version = 1.5.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"

的框架版本

我目前的目标是.NET v4,我确实从项目中引用了System.Net.Http程序集。

以下程序集显示相同的警告:

  • Microsoft.Threading.Tasks.Extensions
  • Microsoft.Threading.Tasks
  • Google.Apis.PlatformServices
  • Google.Apis.Core
  • Google.Apis.Auth.PlatformServices
  • Google.Apis.Auth
  • Google.Apis

我的System.Net.Http版本 2.2.28.0 ,它解释了警告,因为System.Net.Http.Extensions正在寻找版本 1.5.0.0

这导致我创建了以下app.config,它应该删除版本冲突:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.28.0" newVersion="2.2.28.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.13.0" newVersion="1.2.13.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.28.0" newVersion="2.2.28.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

出现相同的错误和警告。

1 个答案:

答案 0 :(得分:1)

问题似乎与类库项目中的程序集重定向有关。使用NuGet时不会发生这种情况,因为NuGet添加了重定向DLL的Microsoft.Bcl.Build.target文件(有关详细信息,请参阅this question)。

似乎有3种可能的解决方案:

  1. 使用NuGet安装软件包。
  2. 下载DLL并在控制台应用程序项目中引用它们,以及带有程序集重定向的app.config。
  3. 下载DLL并在类库中引用它们,并执行以下操作:

    • 在本地复制Microsoft.Bcl.Build.1.0.14包,并将以下内容添加到您的类库csproj中:

      <Import Project="..\PACKAGE_LOCATION\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\PACKAGE_LOCATION\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
      
  4. (将PACKAGE_LOCATION替换为Microsoft.Bcl.Build.1.0.14包的位置)

    • 如果其他项目引用了您的类库,则会出现错误:

          warning : All projects referencing MyProject.csproj must install nuget package Microsoft.Bcl.Build
      
    • 要解决此问题,您必须将DLL和Microsoft.Bcl.Build.targets添加到所有引用程序集(有关详细信息,请参阅this)。

    希望这有帮助。