Во втором применении ключевое слово extern предоставляет псевдоним для внешней сборки, что полезно в тех случаях, когда в состав программы включаются две отдельные сборки с одним и тем же именем элемента. Так, если в сборке testl содержится класс MyClass, а в сборке test2 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт.
Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора /г, как в приведенном ниже примере.
/г:Asml=testl /г:Asm2=test2
А на втором этапе необходимо ввести операторы с ключевым словом extern, в которых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такого оператора для создания псевдонима сборки.
extern alias
Если продолжить приведенный выше пример, то в программе должны появиться следующие строки кода.
extern alias Asml; extern alias Asm2;
Теперь оба варианта классаMyClassбудут доступны в программе по соответствующему псевдониму.
Рассмотрим полноценный пример программы, в которой демонстрируется применение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл —testl.cs.
using System;
namespace MyNS {
public class MyClass { public MyClassO {
Console.WriteLine("Конструирование из файла MyClassl.dll.");
}
}
}
Далее следует исходный текст из файлаtest2.cs.
using System;
namespace MyNS {
public class MyClass { public MyClassO {
Console.WriteLine("Конструирование из файла MyClass2.dll.");
}
}
}
Обратите внимание на то, что в обоих файлах,testl. csиtest2 . cs,объявляется пространство именMyNSи что именно в этом пространстве в обоих файлах определяется классMyClass.Следовательно, без псевдонима оба варианта классаMyClassбудут недоступными ни одной из программ.
И наконец, ниже приведен исходный текст из третьего файлаtest3.cs,где используются оба варианта классаMyClassиз файловtestl. csиtest2 . cs.Это становится возможным благодаря операторам с внешними псевдонимами.
// Операторы с внешними псевдонимами должны быть указаны в самом начале файла, extern alias Asml; extern alias Asm2;
using System;
class Demo {
static void Main {
Asml::MyNS.MyClass t = new Asml::MyNS.MyClass ;
Asm2::MyNS.MyClass t2 = new Asm2::MyNS.MyClass;
}
}
Сначала следует скомпилировать файлыtestl. csиtest2 . csв их библиотечные эквиваленты DLL. Для этого достаточно ввести в командной строке следующее.