Я посмотрел на использование ch некоторое время назад, чтобы видеть, мог ли я использовать его для тестирования методом "черного ящика" DLLs, за который я ответственен. К сожалению, я не мог вполне выяснить, как заставить его загружать и выполнять функции от DLLs. С другой стороны я не был то, что мотивированный и может быть путь.
CLR предоставляет доступность FamilyAndAssembly, которая будет делать то, что вы хотите, но в C # нет синтаксиса для ее использования.
Обходной путь - сделать поле переменной внутренним и вам придется доверять коду в вашей сборке, чтобы не получить к нему несоответствующий доступ.
Вы также можете сделать конструктор PublicBaseClass внутренним, чтобы только ваша сборка могла его создать. Таким образом, только ваши классы могут наследовать от него (даже если сам класс является общедоступным)
Самый простой способ справиться с этим - использовать общедоступные интерфейсы и частные классы. Если вы проводите рефакторинг существующего кода, это не всегда вариант. Один из простых способов облегчить это преобразование - использовать открытый абстрактный класс вместо интерфейса и предоставить статический фабричный метод.
Пример:
public abstract class MyClass
{
public static MyClass New()
{ return new InternalMyClass(); }
}
class InternalMyClass : MyClass
{ }