Здесь объявляется внешний метод.



[DllImport("ExtMeth.dll")]

public extern static int AbsMax(int a, int b);

 

static void Main() {

Использовать внешний метод,

int max = AbsMax(-10, -20);

Console.WriteLine(max);

}

}

 

Обратите внимание на использование атрибута DllImport в приведенной выше программе. Он уведомляет компилятор о наличии библиотеки DLL, содержащей внешний метод AbsMax(). В данном случае это файл ExtMeth.dll, созданный во время компиляции файла с исходным текстом метода AbsMax() на С. В результате выполнения данной программы на экран, как и ожидалось, выводится значение 20.

 

 

Объявление псевдонима внешней сборки

 

Во втором применении ключевое слово extern предоставляет псевдоним для внешней сборки, что полезно в тех случаях, когда в состав программы включаются две отдельные сборки с одним и тем же именем элемента. Так, если в сборке test1 содержится класс MyClass, а в сборке test2 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт.

Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора /г, как в приведенном ниже примере.

 

/г:Asm1=test1 /г:Asm2=test2

 

А на втором этапе необходимо ввести операторы с ключевым словом extern, в которых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такого оператора для создания псевдонима сборки.

 

extern alias имя_сборки;

 

Если продолжить приведенный выше пример, то в программе должны появиться следующие строки кода.

 

extern alias Asml;

extern alias Asm2;

 

Теперь оба варианта класса MyClass будут доступны в программе по соответствующему псевдониму.

Рассмотрим полноценный пример программы, в которой демонстрируется применение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл — test1.cs.

 

using System;

namespace MyNS {

public class MyClass {

public MyClass() {

Console.WriteLine("Конструирование из файла MyClassl.dll.");

}

}

}

 

Далее следует исходный текст из файла test2.cs.

 

using System;

namespace MyNS {

public class MyClass {

public MyClass() {

Console.WriteLine("Конструирование из файла MyClass2.dll.");

}

}

}

 

Обратите внимание на то, что в обоих файлах, test1.cs и test2.cs, объявляется пространство имен MyNS и что именно в этом пространстве в обоих файлах определяется класс MyClass. Следовательно, без псевдонима оба варианта класса MyClass будут недоступными ни одной из программ.

И наконец, ниже приведен исходный текст из третьего файла test3.cs, где используются оба варианта класса MyClass из файлов test1.cs и test2.cs. Это становится возможным благодаря операторам с внешними псевдонимами.

 

// Операторы с внешними псевдонимами должны

// быть указаны в самом начале файла,

extern alias Asml;

extern alias Asm2;

 

using System;

 

class Demo {

static void Main() {

Asm1::MyNS.MyClass t = new Asm1::MyNS.MyClass() ;

Asm2::MyNS.MyClass t2 = new Asm2::MyNS.MyClass();

}

}

 

Сначала следует скомпилировать файлы test1.cs и test2.cs в их библиотечные эквиваленты DLL. Для этого достаточно ввести в командной строке следующее.

 

Csc /t:library test1.cs

Csc /t:library test2.cs

 

Затем необходимо скомпилировать файл test3.cs, указав в командной строке

 

csc /r:Asm1=test1.dll /r:Asm2=test2.dll test3.cs

 

Обратите внимание на применение параметра /r, уведомляющего компилятор о том, что ссылка на метаданные находится в соответствующем файле. В данном случае псевдоним Asm1 связывается с файлом test1.dll, а псевдоним Asm2 — с файлом test2.dll.

В самой программе псевдонимы указываются в приведенных ниже операторах с модификатором extern, которые располагаются в самом начале файла.

 

extern alias Asm1; extern alias Asm2;

 

А в методе Main() псевдонимы используются для разрешения неоднозначности ссылок на класс MyClass. Обратите внимание на следующее применение псевдонима для обращения к классу MyClass.

 

Asm1::MyNS.MyClass

 

В этой строке кода первым указывается псевдоним, затем оператор разрешения пространства имен, далее имя пространства имен, в котором находится класс с неоднозначным именем, и, наконец, имя самого класса, следующее после оператора-точки. Та же самая общая форма пригодна и для других внешних псевдонимов.

Ниже приведен результат выполнения данной программы.

 


Дата добавления: 2019-02-12; просмотров: 249; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!