Ссылка на другой проект в одной сборке, в разных пространствах имен - PullRequest
3 голосов
/ 15 июня 2010

У меня есть два проекта: Menu и Module, и они оба находятся в одном и том же пространстве имен foobar.

В настоящее время я обращаюсь к проекту модуля из проекта Меню, чтобы открыть определенные элементы управления в элементе управления вкладки в моем меню. Однако мне нужно запустить новый элемент управления из одного из моих элементов управления, который находится в проекте модуля.

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

Вот пример того, что это:

Меню проекта

Public Void LaunchWPFControl(string pHeader,string pPath)
{
     //Code goes here to launch a WPF control in the browser
}

Модуль проекта

//What I would love to do but doesn't work
Using Menu;
...
...
...
private void dgModule_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
     Menu.LaunchWPFControl("Accounts","AccountsControl");
}

Ответы [ 3 ]

4 голосов
/ 15 июня 2010

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

Если вам нужен класс в модуле проекта для запуска чего-либо в проекте меню, вам нужно искать альтернативный способ сделать это. Одним из возможных способов достижения этого является создание события в классе в проекте модуля, на который проект Menu может подписаться и выполнить требуемое действие.

Например, в модуле проекта:

private void dgModule_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    OnMyEvent();
}

private void OnMyEvent()
{
    EventHandler localEvent = MyEvent;
    if(localEvent != null)
    {
        localEvent(this, EventArgs.Empty);
    } 
} 

Затем в Project Menu вы можете подписаться на это событие и выполнить свое действие:

...
...
...
moduleClass.MyEvent += SomeHandler;
...
...
...
private void SomeHandler(Object sender, EventArgs e)
{
    Menu.LaunchWPFControl("Accounts","AccountsControl");
}    

Как упоминает Рэй Бернс (см. Комментарии), другим способом было бы определить интерфейс класса Menu в некотором совместно используемом месте (либо в проекте, на который есть ссылка, либо в каком-либо другом общем проекте), и затем передать эти реализации в Модуль проекта.

Какой путь лучше, часто зависит от абстракции, которую вы пытаетесь достичь с каждым проектом.

0 голосов
/ 15 июня 2010

Итак, Project Menu ссылается на Project Module.Затем вы хотите, чтобы модуль проекта ссылался на меню проекта, чтобы модуль мог напрямую вызывать функции меню?

Это невозможно, это циклическая ссылка.Если вы попытаетесь добавить ссылку на Меню в проект модуля, Visual Studio не позволит вам.

Вам нужно вытащить содержимое из меню, которое и Меню, и Модуль хотят использовать в третьем проекте,пусть они оба ссылаются на него.Или объедините Меню и Модуль в один проект.

0 голосов
/ 15 июня 2010

Если они оба находятся в пространстве имен foobar, тогда вам нужно

using foobar;

вместо using Menu.

Важно, чтобы вы понимали используемую терминологию - вы говоритенасчет "другого проекта в той же сборке" - это бессмысленно.Visual Studio создает одну сборку на проект.Затем вы говорите о проектах, имеющих то же самое пространство имен в тексте вашего вопроса.Вы должны понимать разницу.

Чтобы определить пространство имен типа, откройте класс, содержащий тип, и найдите объявления пространства имен:

namespace MyProject
{
    ...
}

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

Обратите внимание, что вы указываете пространство имен с директивой using;вам нужно добавить ссылку на сборку в обозревателе решений.Они не делают то же самое.Директива using просто говорит: «В коде, затронутом этой директивой using, я хочу иметь возможность использовать типы в этом пространстве имен без полной квалификации имен».

Теперь у вас есть такой код:

Menu.LaunchWPFControl("Accounts","AccountsControl");

Я думал, что Menu было либо именем проекта, либо пространством имен - но теперь вы пытаетесь использовать его как type name.Что это?

Если это не поможет вам, пожалуйста, опубликуйте полный код и более понятное описание проектов и пространств имен.Сделайте шаг назад, определите типы, пространства имен и сборки, а затем четко изложите все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...