У меня есть следующая проблема.У меня есть решение, которое содержит около 40 проектов.Есть проект A, который ссылается на проект B, который ссылается на проект C. В проекте A нет кода, который бы использовал классы из проекта C. Однако, если я использую какой-либо метод расширения LINQ в любом коде, например:
var r = new int[] { 1, 2, 3 }.Where(a => a > 1);
Я получаю ошибку компилятора:
somefile.cs (70,13): ошибка CS0012: тип "XXX" определен в сборке, на которую нет ссылок.Необходимо добавить ссылку на сборку «Имя сборки Project C, версия = 0.0.0.0, Culture = нейтральный, 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), он компилируется.Это ЕДИНСТВЕННЫЙ код в проекте А. Он компилируется, если я удаляю использование метода расширения или удаляю «используя Б», как я уже говорил.
Обновление 3:
Прежде всего, спасибо за все ваши предложения.Самый маленький пример, который я могу придумать, следующий.Я создал новый проект, csproj выглядит так (ничего не изменилось, только имя проекта C и руководство по проекту 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'.
Если я удаляю using C;
, он прекрасно компилируется.
Заранее спасибо за помощь.