Ссылка на открытый статический класс в глобальном пространстве имен в другой сборке
В 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();
Я все еще пошел на добавление пространства имен к сгенерированному коду - это более просто и избегает загрязнения глобального пространства имен.