Я столкнулся со странной проблемой, которую только что заметил.
Если у вас есть решение с 3 проектами
** ПРИМЕЧАНИЕ Редактируется после обсуждения **
Project LibA - имеет ClassA
namespace LibA
{
public class ClassA
{
public override string ToString()
{
return "The logic in class A!";
}
}
}
Project LibB - имеет ClassB
using LibA;
namespace LibB
{
public class ClassB
{
public ClassA a;
public ClassB()
{
a = new ClassA();
}
public object Foo()
{
return a;
}
}
}
Project LibC - имеет ClassC
using LibB;
namespace LibC
{
public class ClassC
{
public ClassB b;
public ClassC()
{
b = new ClassB();
}
public object Foo()
{
return b.Foo();
}
}
}
Наконецтестовый драйвер
using System;
using LibC;
namespace Shell
{
class Program
{
static void Main(string[] args)
{
ClassC c = new ClassC();
Console.WriteLine(c.Foo());
}
}
}
Теперь, если вы скомпилируете это, все будет отлично работать.Если вы изучите содержимое бинарной папки LibC, то увидите, что она автоматически прокручивается через цепочку зависимостей, чтобы определить, что ей нужно использовать LibA и LibB
Однако, если вы измените ClassB для наследования от классаНапример, при попытке
using LibA;
namespace LibB
{
public class ClassB : ClassA
{
ClassA a;
}
}
при компиляции вы получите ошибку
Ошибка 2 Тип 'LibA.ClassA' определен в сборке, на которую нет ссылок.Вы должны добавить ссылку на сборку «LibA, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null».
** Оригинальный вопрос **
Кто-нибудь знает, почему (будь то msbuild или visual studio) он достаточно умен, чтобы ссылаться на LibA, когда ClassA является членом ClassB, но это не так?достаточно умен, чтобы ссылаться на LibA, когда ClassA является базовым классом ClassB?
Я знаю, что это непристойно, но я был бы очень признателен за некоторое последовательное поведение
** Исправленный вопрос с этими наблюдаемыми тестами **
Я слышу, что некоторые определяют как «прямые» или «косвенные» ссылки.Однако direct - это не просто область видимости, а наследование и фактическое использование типа.
Без наследования тестовый драйвер достаточно умен, чтобы разрешать и автоматически ссылаться на LibA, LibB и LibC.
Существует открытый член ClassA, видимый в ClassB, и все же это само по себе не приводит к ошибке компиляции / компоновки.
Отладчик определенно разрешает ClassA из тестового драйвера,так что он явно загрузил правильную сборку.
Так что с учетом всего этого.Теперь я получаю весь "прямой" и "косвенный" материал.
То, что мне до сих пор не понятно, почему компоновщик / компилятор / IDE по крайней мере не пытается автоматически ссылаться на зависимости ссылочнойбиблиотека в "прямом" сценарии?Он достаточно умен, чтобы знать, что зависимости существуют, и ссылаться на них в «косвенном» сценарии.