引用同一程序集中的不同项目,不同的名称空间

时间:2010-06-14 20:16:06

标签: c# wpf assemblies .net-4.0 namespaces

我有两个项目:Menu和Module,它们都位于同一名称空间foobar。

我目前正在从菜单项目中引用模块项目,以在菜单中的选项卡控件上打开某些控件。但是,我需要从我的一个控件启动一个新控件,该控件位于Module项目中。

当我尝试引用菜单项目时,当我尝试使用using引用它时,它不会显示在我的intellisense中。我在逻辑上做错了吗?

这是一个例子:

项目菜单

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 个答案:

答案 0 :(得分:4)

如果您正在谈论单独的项目,那么您在此处尝试做的是循环引用,这是不允许的。如果项目菜单引用了项目模块,则项目模块无法引用项目菜单。

如果您需要Project Module中的类来触发Menu项目中的某些内容,您需要寻找另一种方法。实现此目的的一种可能技术是在Module项目的类中创建一个事件,Menu项目可以订阅该事件并执行所需的操作。

例如,在项目模块中:

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

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

然后在“项目菜单”中,您可以订阅此活动并执行操作:

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

正如Ray Burns所提到的那样(参见注释)另一种方法是在某个共享位置(有引用的项目或其他一些共享项目)中定义Menu类的接口,而不是将该接口的实现传递给模块项目。

哪种方式更好通常取决于您尝试使用每个项目实现的抽象。

答案 1 :(得分:0)

如果它们都在命名空间foobar中,则需要

using foobar;

而不是using Menu

了解所涉及的术语非常重要 - 您正在谈论“同一集会中的不同项目” - 这是荒谬的。 Visual Studio为每个项目创建一个程序集。然后,您将在问题文本中讨论具有相同命名空间的项目。你需要了解其中的差异。

要计算出类型的名称空间,请打开包含该类型的类并查找名称空间声明:

namespace MyProject
{
    ...
}

要计算出类型的程序集,请查看声明它的项目的项目属性 - 或者如果您使用相同的解决方案,只需添加项目中的引用即可希望使用类型到声明类型的项目。

请注意,您使用using指令指定名称空间;您需要在解决方案资源管理器中添加对程序集的引用。他们没有做同样的事情。 using指令只是说,“在受此using指令影响的代码中,我希望能够在此命名空间中使用类型,而无需完全限定名称。”

接下来你有这样的代码:

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

我认为Menu是项目名称或命名空间 - 但现在您尝试将其用作类型名称。这是什么?

如果这不能解决您的问题,请发布完整的代码以及所涉及的项目和命名空间的更一致的描述。退后一步,找出所涉及的类型,命名空间和程序集,然后清楚地完成所有工作。

答案 2 :(得分:0)

所以Project Menu引用了Project Module。那么您希望Project Module引用Project Menu,以便模块可以直接调用Menu功能吗?

这是不可能的,这是一个循环引用。如果您尝试将Menu引用添加到Module项目,Visual Studio将不允许您。

你需要将菜单中的东西从菜单中取出,菜单和模块都要用于第三个项目,并让它们都引用它。或者将菜单和模块组合到一个项目中。