2009-10-15 2 views
1

У меня есть решение под названием «Инструменты», в котором есть три проекта; Инструменты, PerecentageBar, MessageBox. Каждый из этих проектов является частью сборки «Инструменты». [На странице свойств каждого из них я установил AssemblyName в MyCompany.Tools.Controls].Почему пространство имен не распознается?

я в Инструменты проекта:

namespace MyCompany.Tools.Controls 
{ 
    public class MyPictureBox : PictureBox 
    {} 
} 

И в проекте MessageBox.

namespace MyCompany.Tools.Controls 
{ 
    public class MyMessageBox : Form 
    {} 
} 

И в проекте PercentageBar

namespace MyCompany.Tools.Controls 
{ 
    public class PercentageBar: UserControl 
    {} 
} 

Это решение построено и MyCompany.Tools.Controls.dll создан.

В другом решении у меня есть проект под названием MapperTool.

namespace MapperTool 
{ 
    public class MapperToolFacade : IDisposable, IDiagService 
    {} 
} 

В этом проекте я добавить ссылку на DLL выше и добавить, используя заявление таким образом:

using MyCompany.Tools.Controls; 

Все хорошо до сих пор, однако. В этом проекте я могу только «видеть» и использовать MyPictureBox с помощью вышеприведенной инструкции. Другие типы MyMessageBox и PercentageBar недоступны.

Почему это?

EDIT: Исследование показывает, что существуют другие типы и под пространством имен MyCompany.Tools.Controls. Однако, глядя в класс, они не перечислены в сборке MyCompany.Tools.Controls. Вместо этого они организованы таким образом:

MyCompany.Tools.Controls     (assembly) 
    MyCompany.Tools.Controls    (namespace) 
     MyPictureBox      (type) 

PercentageBar 
    MyCompany.Tools.Controls 
     PercentageBar 

MyMessageBox 
    MyCompany.Tools.Controls 
     MyMessageBox 

Так что я думаю, следующий вопрос, если я указал имя сборки, как MyCompany.Tools.Controls в каждом проекте почему вторые два проекта был построен в сборе с другое имя? [DLL в выходном каталоге, однако, имеет naem MyCompany.Tools.Controls.dll]

Кроме того, я хочу создать все свои элементы управления в пространстве имен MyCompany.Tools.Controls и создать их в одном MyCompany.Tools .Controls assembly, так что я могу добавить только эту ссылку на любой другой проект, который должен их использовать.

Похоже на то, что происходит над тем, что каждый отдельный проект инструментов в моем решении MyCompany.Tools.Controls должен быть встроен в уникальную сборку и что каждый из них нужно будет ссылаться индивидуально ...?

Проблема была в моем понимании проектов и сборок. Похоже, что невозможно собрать 3 проекта в одну сборку. Каждый из них должен построить свою собственную сборку - тогда мне придется использовать инструмент слияния, чтобы объединить их в одну сборку.

+0

Это поведение совершенно противоположно тому, что я вижу. Если я упоминаю это в другом проекте, MyCompany.Tools.Controls.MyMessageBox видна, но не Controls.MyMessageBox. Возможно ли, что DLL, на которую вы ссылаетесь, не синхронизирована с источником? Был ли MyMessageBox ранее в пространстве имен верхнего уровня, называемом Controls? –

+0

У вас нет класса с именем 'MyCompany'? – tofi9

ответ

1

Edit - на основе ваших комментариев, я догадка о том, что случилось:

Ассамблеи1 определяет класс MyMessageBox в пространстве имен MyCompany.Tools.Controls.

Assembly2 ссылки Assembly1 и определяет хотя бы один класс в пространстве имен Controls. То есть, объявление класса выглядит следующим образом:

namespace Controls { 
    public class MyControl { 
     // ... 
    } 
} 

Ассамблеей3 референции скомпилированный Assembly2.

Если это так, то Ассамблеей3 может видеть пространство имен Controls но не MyCompany или MyCompany.Tools, потому что ни один из этих пространств имен используются классом в указанной сборке. Пространство имен по умолчанию для проекта используется только для создания значений по умолчанию для новых файлов классов и для создания пространств имен для встроенных ресурсов - на самом деле оно не существует в сборке, если вы не определяете тип, который его использует.

Если я правильно понял, вы должны добавить тип Assembly2 в пространство имен MyCompany.Tools.Controls. Это сделает видимые пространства имен верхнего уровня для Assembly3.

Если Assembly2 содержит другую часть частичного класса MyMessageBox, ее необходимо будет объявить в том же пространстве имен, что и другая часть.


Похоже, что он должен работать (и в моих тестах). В то же время, попробуйте изменить его:

namespace MyCompany.Tools.Controls 
{ 
    public partial class MyMessageBox : Form {} 
} 

Это не имеет никакого значения, но это более идиоматических способ определения вложенных пространств имен в C#.

+0

Да, это аккуратно. Однако никакого различия. Итак, у меня есть решение под названием «Инструменты» и в этом проекте под названием «Инструменты». Есть еще два проекта под названием ToolA & ToolB. Каждый из них имеет имя сборки инструментов и находится в пространстве имен «Инструменты». Однако класс explorer видит только типы в проекте Tools. Не типы в проектах ToolA и ToolB? – Kildareflare

+0

Только для этого: все три проекта (Tools, ToolA и ToolB) находятся в одном решении («Инструменты»), но только виды «Инструменты» отображаются в представлении класса? Или проекты ToolA и ToolB находятся в отдельном решении, на которое ссылается проект Tools (как dlls)? Являются ли их типы видимыми в представлении класса в рамках проекта Project Tools? –

+0

Все три проекта в одном решении. В другом решении я добавляю ссылку на DLL, построенную первым решением, и добавляю оператор using для пространства имен. Во втором решении в представлении класса отображаются только инструменты. Я хочу, чтобы первое решение содержало все мои элементы управления под одним пространством имен. Тогда ссылайтесь на это в других решениях. – Kildareflare

4

Используйте директиву using.

MSDN: using Directive (C#)

Так что в вашем случае, это было бы: using MyCompany.Tools - это идет с другими с помощью операторов, которые были автоматически сгенерированы в исходном файле.

Редактировать: попробуйте using Controls = MyCompany.Tools.Controls.Обычно я не ссылаюсь на пространства имен в коде, используя псевдоним, если только мне это не нужно, но я думаю, что это должно сработать.

+0

Nope попробовал это. Использование MyCompany возвращает ошибку - пространство имен не найдено. Я думаю, возможно, это связано с тем, как настроено решение, содержащее MyMessageBox. Возможно, имя сборки.У меня есть аналогичная проблема, при которой только элементы управления в проекте с тем же именем, что и решение, видны, когда на это решение ссылается другое. – Kildareflare

2

Добавили ли вы ссылку на эту сборку в свой новый проект?

2

Пространства имен не экспортируются по ссылке. Только типы (и функции). Чтобы «видеть» пространство имен MyCompany, вам нужно будет добавить тип (класс) непосредственно под этим пространством имен.

0

Чтобы устранить эту проблему, вы можете использовать Проводник классов в Visual Studio для проверки пространства имен, в котором находится класс. Сначала я должен проверить, действительно ли MyMessageBox находится в пространстве имен, которое вы считаете.

Затем, если это так, как и ожидалось, вы должны сосредоточиться на своем втором проекте. Является ли ваш другой класс в пространстве имен MyCompany.Tools? Это, случайно, объявляет классы MyCompany или Tools (визуальная студия может отключиться, если локальный класс конфликтует с импортированным пространством имен).

+0

Хорошо, тип не в классе Explorer, где я ожидаю. Мое решение называется CustomControls, в нем есть проект под названием CustomControls, а другой - MyMessageBox. Более поздняя версия не появляется в пространстве имен. Нужно ли мне гарантировать, что все проекты имеют одинаковое пространство имен и по умолчанию в своих свойствах? – Kildareflare