Я хотел бы добавить причину этого, найденную в VB.NET (Visual Studio 2010, в моем случае; ваша может отличаться).
Например, у меня есть два проекта: P1 и P2.
P1 - это приложение, а P2 - библиотека классов.
УСЛОВИЯ:
- В P1 есть ссылка на P2
- Как P1, так и P2 нацелены на .NET 4.0 (полный, а не на клиент)
- И P1, и P2 нацелены на x86 (не то чтобы это, вероятно, имеет значение)
- 0 ошибок и 0 предупреждений
Однако в P1 невозможно ни объявить выражение «Imports P2 ...», ни использовать какие-либо совместно используемые методы, найденные в P2. Это так же, как если бы Пространство имен P2 не существует, хотя ссылка есть.
Причина: P2 был преобразован в отдельную сборку из кода, в котором все методы содержались в публичном модуле VB.NET. Однако «Модуль» не был перепечатан как Публичный класс.
Никаких ошибок, но пространство имен P2 было полностью недоступно для P1, пока не был создан открытый класс.
Следует отметить, что на самом деле не было необходимости конвертировать оригинальный Модуль в Класс. Необходимо было только объявить some Public Class (даже если он пуст) в пространстве имен P2, и тогда все методы, найденные в этом Public Module, были доступны.