【问题标题】:Reference a public static class in the global namespace in another assembly在另一个程序集中引用全局命名空间中的公共静态类
【发布时间】:2017-02-15 18:38:57
【问题描述】:

在 C# 中,有没有办法从程序集 B 访问程序集 A 中全局命名空间中的公共静态类(假设程序集 B 引用程序集 A),当程序集 B 在全局命名空间中有公共静态类时有相同的名字?例如在程序集 A 中的Bar.cs

using System.Diagnostics;
// NOTE: No namespace declared here - this is in the global:: ns
public static class Bar
{
    public static void DoSomethingSilly()
    {
        Debug.WriteLine("I'm silly!");
    }
}

如何在程序集 B 的 Bar.cs 中使用它?

public static class Bar
{
    public static void DoSomethingSilly()
    {
        // call Bar.DoSomethingSilly() from assembly A here
    }
}

我尝试了global::Bar.DoSomethingSilly() 之类的方法,但它在程序集 B 中不起作用(它只是让我将引用返回到程序集 B)。

我也知道我可以使用反射来解决它(类似于Assembly.GetType()),但我更想知道它是否有一些本机 C# 语法。最后,我在程序集 A 中的代码周围添加了一个命名空间,它是我拥有的,并且仅在全局命名空间中,因为它是由另一个工具生成的 - 添加命名空间不会导致任何问题,但我很好奇是否有允许这种引用的语法。

【问题讨论】:

  • 在汇编 B 中应该绝对没问题。不需要额外的语法。将通过实际操作进行仔细检查,但应该没有任何问题。
  • 啊,我忘了提到一个特殊的皱纹......程序集 B 有另一个同名的静态类。我会更新问题。
  • 也在全局命名空间中?在这种情况下,extern alias 就是您所追求的。
  • 这正是我想要的,谢谢。

标签: c# .net namespaces .net-assembly


【解决方案1】:

感谢@Jon Skeet 的指导 - 外部别名可以使这项工作发挥作用。在对程序集的引用的属性上,添加一个别名(例如 assemblyA,或在从here 截取的屏幕截图中FooVersion1):

,并在 .cs 文件的顶部添加:

extern alias assemblyA;

这将允许:

assemblyA::Foo.DoSomethingSilly();
assemblyA.Foo.DoSomethingSilly();

我仍然想为生成的代码添加一个命名空间——它更直接,并且避免污染全局命名空间。

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2013-04-21
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多