Ссылка на открытый статический класс в глобальном пространстве имен в другой сборке

В C# есть ли способ получить доступ к общедоступному статическому классу в глобальном пространстве имен в сборке A из сборки B (при условии, что сборка B ссылается на сборку A), когда сборка B имеет общедоступный статический класс в глобальном пространстве имен с тем же именем? Например в 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!");
    }
}

Как я мог использовать это в 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, которым я владею и который был только в глобальном пространстве имен, потому что он был сгенерирован другим инструментом - добавление пространства имен не вызвало никаких проблем, но мне любопытно, если есть синтаксис, чтобы разрешить этот вид ссылок.

1 ответ

Решение

Спасибо @Jon Skeet за это направление - внешний псевдоним - вот что может сделать эту работу. В свойствах для ссылки на сборку добавьте псевдоним (например, assemblyAили на скриншоте, взятом отсюда FooVersion1):

пример окна свойств

и в верхней части.cs файла добавьте:

extern alias assemblyA;

который тогда позволит либо:

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

Я все еще пошел на добавление пространства имен к сгенерированному коду - это более просто и избегает загрязнения глобального пространства имен.

Другие вопросы по тегам