У меня есть исходный код, полученный от внешнего разработчика, этот код разделен на 4 типа проектов: их структура, среда для моего проекта (назовем его «ENV»), база приложения (назовите его «Base») ") и само приложение (около 20 dll я в совокупности назову" Приложение ").
Теперь я добавил еще один слой к этому беспорядку, dll с именем AdvanceFeatures. Он лежит прямо под ENV (сверху каркаса).
Эта dll ссылается только на структуру, и ENV ссылается на нее.
Только ENV использует эту DLL AdvanceFeatures, в то время как Base и App используют только ENV.
То, как я здесь работаю, заключается в том, что большинство объектов в приложении определены в Base и наследуют / реализуют классы / интерфейсы в ENV. Также небольшая часть этих объектов (в App и Base) наследует / реализует классы / интерфейсы от самой платформы (но это довольно редко).
Пока все хорошо, кроме одного факта. Компилятор требует, чтобы я добавил ссылку на DLL-файл AdvanceFeatures из каждой библиотеки DLL в приложении и из Base.
Я не использую AdvanceFeatures за пределами ENV, так зачем нужны эти ссылки?
Редактировать: Я создал демонстрационный проект для этой проблемы. Это детали проекта:
Assembly: AdvanceFeatures
References: Nothing (Reference project-folder is empty)
Classes: Decorator, IEnvClass, IDecorator
IDecorator contents:
namespace AdvanceFeatures
{
public interface IDecorator
{
IEnvClass Decorated { get; }
void Decorate();
}
}
IEnvClass contents:
namespace AdvanceFeatures
{
public interface IEnvClass
{
string Name { get; set; }
}
}
Decorator contents:
namespace AdvanceFeatures
{
public class Decorator : IDecorator
{
public Decorator(IEnvClass decorated)
{
Decorated = decorated;
}
#region Implementation of IDecorator
public IEnvClass Decorated { get; set; }
public void Decorate()
{
Decorated.Name = "NewName";
}
#endregion
}
}
Assembly: ENV
References: AdvanceFeatures (Compiled DLL)
Contents of only class SomeEnvClass:
namespace ENV
{
public class SomeEnvClass : AdvanceFeatures.IEnvClass
{
public string Name { get; set; }
private readonly AdvanceFeatures.IDecorator _decorator;
public SomeEnvClass(string name)
{
Name = name;
_decorator = new AdvanceFeatures.Decorator(this);
_decorator.Decorate();
}
public string Foo()
{
return Name;
}
}
}
Assembly: TestBase
References: ENV (compiled DLL)
Contents of only class SomeEnvExtendingClass:
namespace TestBase
{
public class SomeEnvExtandingClass : ENV.SomeEnvClass
{
public SomeEnvExtandingClass(string name) : base(name)
{
}
}
}
Я получаю ошибку:
Ошибка 1 Тип 'AdvanceFeatures.IEnvClass' определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «AdvanceFeatures, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль». E: \ Projects \ Dev \ TestReferenceInheritance \ TestBase \ SomeEnvExtandingClass.cs 3 18 TestBase
Теперь я знаю, почему DLL должна быть доступна для скомпилированного исполняемого файла, но почему разработчик должен знать внутреннюю работу ENV (точнее, это дерево наследования) для его расширения?