Вам необязательно вносить какие-либо изменения в код приложения или базы, чтобы ссылаться на один из классов в AdvanceFeatures (например, var MyItem = ENV.foo.bar ();), поскольку var неявно является тем, что возвращается bar, вам не нужно было бы менять этот код, если bar изменился, чтобы вернуть другой тип (при условии, что в нем все еще использовались какие-либо методы и т. д.). Это все еще не может быть проблемой в вашем случае.

я есть исходный код, полученный от внешнего разработчика, этот код разделен на 4 типа проектов: их структура, среда для моего проекта (назовем его «ENV»), база приложения (назовите его «Base») и само приложение (около 20 dll я в совокупности назову «приложение»).

Теперь я добавил еще один слой к этому беспорядку, dll под названием AdvanceFeatures. Он лежит прямо под ENV (сверху каркаса). Эта dll ссылается только на структуру, и ENV ссылается на нее. Только ENV использует эту dll AdvanceFeatures, в то время как Base и App используют только ENV.

Я работаю здесь так, что большинство объектов в приложении определены в Base и наследуют / реализуют классы / интерфейсы в ENV. Также небольшая часть этих объектов (в App и Base) наследует / реализует классы / интерфейсы от самой платформы (но это довольно редко).

Пока все хорошо, кроме одного факта. Компилятор требует, чтобы я добавил ссылку на DLL-файл AdvanceFeatures из каждой библиотеки в App и из 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 (точнее, это дерево наследования) для его расширения?

Ответы на вопрос(3)

Ваш ответ на вопрос