Используете ли вы какой-то обфускатор или оптимизатор (например, Dotfuscator), который может удалять типы, потому что он думает, что они не используются?Если это так, вам придется настроить это программное обеспечение так, чтобы оно не удаляло их.Это не проблема компилятора C #.
В остальном, я никогда не видел этого сам.Все типы всегда присутствуют в сборке, даже если на них нет ссылок.Все остальное было бы чокнутым, потому что это сделало бы Reflection действительно бесполезным, как вы заметили.
Итак, чтобы проверить это, я просто скомпилировал небольшой проект с двумя неиспользуемыми классами и одним классом, который используется только одним из неиспользуемыхклассы.Ни один из них не был удален, даже в режиме Release и даже с включенной «оптимизацией».
Если вы можете привести небольшой пример, когда компилятор действительно удаляет тип, это, вероятно, будет ошибкой компилятора, и вам, возможно, следуетрассмотрите возможность сообщения об этом на connect.microsoft.com.