【问题标题】:Referencing a different project in the same assembly, different namespaces在同一个程序集中引用不同的项目,不同的命名空间
【发布时间】:2011-03-03 16:54:34
【问题描述】:

我有两个项目:Menu 和 Module,它们都在同一个命名空间 foobar 中。

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

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

这是一个例子:

项目菜单

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");
}

【问题讨论】:

  • 只是再次检查:您已通过右键单击“参考”并选择“添加参考”将其他项目添加为参考正确吗?

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


【解决方案1】:

如果您在谈论单独的项目,那么您在这里尝试做的是循环引用,这是不允许的。如果项目菜单引用项目模块,则项目模块不能引用项目菜单。

如果您需要 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 提到的(参见 cmets),另一种方法是在某个共享位置(引用的项目或其他共享项目)中定义 Menu 类的接口,然后您可以将该接口的实现传递给模块项目。

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

【讨论】:

  • 是的。另一种技术是在被引用的项目中定义一个接口,然后在引用的项目中实现它,并将你的实现对象传递给被引用的项目。
  • @Ray:好建议,我已经更新了答案。随意调整它。
【解决方案2】:

所以项目菜单引用项目模块。那么你想让 Project Module 引用 Project Menu 以便模块可以直接调用 Menu 功能吗?

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

您需要将 Menu 和 Module 都想使用的东西从 Menu 中提取到第三个项目中,并让它们都引用它。或者将 Menu 和 Module 合并到一个项目中。

【讨论】:

    【解决方案3】:

    如果它们都在命名空间 foobar 中,那么您需要

    using foobar;
    

    而不是using Menu

    理解所涉及的术语很重要——你说的是“同一个程序集中的不同项目”——这很荒谬。 Visual Studio 为每个项目创建一个程序集。然后,您在问题的文本中讨论具有 same 命名空间的项目。您需要了解其中的区别。

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

    namespace MyProject
    {
        ...
    }
    

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

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

    接下来你会得到这样的代码:

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

    我认为Menu 是项目名称或命名空间 - 但现在您尝试将其用作 type 名称。是哪个?

    如果这不能解决您的问题,请发布完整代码以及对所涉及的项目和命名空间的更连贯的描述。退后一步,弄清楚所涉及的类型、命名空间和程序集,然后把它们都清楚地列出来。

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2018-01-18
      • 2012-10-17
      • 2021-07-04
      相关资源
      最近更新 更多