В C / C ++ определение класса присутствует в заголовочном файле .h. Это дает вам возможность ссылаться на информацию о классе (при необходимости, например, когда вы хотите наследовать от этого класса) без необходимости в исходном файле с информацией о реализации. Недостатком является дублирование кода (реализация в файле .cpp должна повторять большую часть информации в файле .h).
В мире .NET дизайн отличается: сборка содержит как код класса (байт-код CLR), так и все метаданные (имя класса, информацию о его членах и т. Д.), Необходимые, например, для: наследовать от этого класса.
Следствием такой конструкции является то, что для использования класса, определенного в сборке A, который наследуется от класса в сборке B, для .NET необходимы сборки A и B. Или, в более общем смысле: если вы используете что-либо из данной сборки (класс, перечисление, структура), прямо или косвенно, вам нужно ссылаться на эту сборку.
Я не уверен, что вы хотите предотвратить. Если вы решите разделить свой код на две сборки, как вы описали, то нет необходимости ссылаться на них обоих.
Конечно, существуют разные способы структурирования вашего кода, но не зная, какую цель вы пытаетесь достичь, разбив код на две сборки, во-первых, невозможно сделать полезное предложение.