Проблема с LINQ - необходимо добавить ссылка на ненужную библиотеку

У меня следующая проблема. У меня есть решение, которое содержит около 40 проектов. Существует проект A, который ссылается на проект B, который ссылается на проект C. В проекте A нет кода, который использует классы из проекта C. Однако, если я использую любой метод расширения LINQ в любом коде, например:

var r = new int[] { 1, 2, 3 }.Where(a => a > 1);

Я получаю ошибка компилятора:

somefile.cs (70,13): ошибка CS0012: тип «XXX» определен в сборке, на которую нет ссылки. Вы должны добавить ссылку на сборку «Имя сборки проекта C, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = xxx».

Ошибка находится в строке, которая использует метод расширения linq.

Я использую VS2010, .NET 3.5.

Обновление: Это происходит с каждым методом расширения. Я создал в том же файле класс, который выглядит так:

public static class SomeClass
{
    public static int[] Test(this int[] a)
    {
        return a;
    }
}

А затем я пишу этот код, и компиляция прерывается с той же ошибкой:

new int[] { 1, 2, 3 }.Test();

Update2: Хорошо, я выяснил, что вызывает ошибку. Но я не не знаю почему. Следующий код вызывает ошибку:

using System.Linq;
using B;

namespace TestApp
{
    public class A
    {
        public void M()
        {
            var c = new string[] { "a", "b", "c" }.Where(s => s != null);
        }
    }
}

Но если я удалю использование B (я все еще следую именам из моего описания, которые A ссылаются на B, B ссылаются на C), он компилируется. Это ЕДИНСТВЕННЫЙ код в проекте A. Он компилируется, если я удалю использование метода расширения или если я удалю "using B", как я сказал ранее.

Update3:

Прежде всего, спасибо за все ваши предложения. Самый маленький пример, который я могу придумать, - это следующий. Я создал новый проект, csproj выглядит следующим образом (ничего не было изменено, только имя проекта C и guid проекта C):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{B649AB2C-926A-4AD1-B7E3-5A29AE1E9CC2}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ClassLibraryTest</RootNamespace>
    <AssemblyName>ClassLibraryTest</AssemblyName>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\C.csproj">
      <Project>{55AFFA2D-63E0-4BA9-XXXX-B70E6A936F5E}</Project>
      <Name>C</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Class1.cs" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Properties\" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Class1.cs содержит следующий код:

using C;

namespace TestApp
{
    public static class Ext
    {
        public static void M213dsacxvz(this string[] a)
        {
        }
    }

    public class A
    {
        public void B()
        {
            new string[] { "a", "b", "c" }.M213dsacxvz();
        }
    }
}

Ошибка компилятора, которую я получаю, выглядит следующим образом:

D: \ xxx \ Class1.cs (16,13): ошибка CS0012: тип «xxx» определен в сборке, на которую нет ссылки. Вы должны добавить ссылку на сборку «xxx, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = xxx».

Если я удалю с помощью C; он компилируется нормально.

Спасибо за заранее за помощью.

13
задан empi 14 May 2011 в 09:09
поделиться