Страница 342 из 502
<b>extern возвращаемый_тип имя_метода (список_аргументов) ;</b>
Обратите внимание на отсутствие фигурных скобок.
В данном варианте ключевое слово extern нередко применяется вместе с атрибутом DllImport, обозначающим библиотеку DLL, в которой содержится внешний метод. Атрибут DllImport принадлежит пространству имен System.Runtime.InteropServices. Он допускает несколько вариантов, но, как правило, достаточно указать лишь имя библиотеки DLL, в которой содержится внешний метод. Вообще говоря, внешние методы следует программировать на С. (Если же это делается на C++, то имя внешнего метода может быть изменено в библиотеке DLL путем дополнительного оформления типов.)
Для того чтобы стало понятнее, как пользоваться внешними методами, обратимся к примеру конкретной программы, состоящей из двух файлов. Ниже приведен исходный код С из первого файла ExtMeth.с, где определяется метод AbsMax().
<b>#include <stdlib.h></b>
<b>int __declspec(dllexport) AbsMax(int a, int b) {</b>
<b> return abs(a) < abs(b) ? abs(b) : abs(a);</b>
<b>}</b>
В методе AbsMax() сравниваются абсолютные значения двух его параметров и возвращается самое большое из них. Обратите внимание на обозначение __declspec(dllexport). Это специальное расширение языка С для программных средств корпорации Microsoft. Оно уведомляет компилятор о необходимости экспортировать метод AbsMax() из библиотеки DLL, в которой он содержится. Для компилирования файла ExtMeth.с в командной строке указывается следующее.
<b>CL /LD /MD ExtMeth.с </b>
В итоге создается библиотечный файл DLL — ExtMeth .dll.
Далее следует программа на С#, в которой применяется внешний метод AbsMax().
<b>using System;</b>
<b>using System.Runtime.InteropServices;</b>
<b>class ExternMeth {</b>
<b> // Здесь объявляется внешний метод.</b>
<b> [DllImport("ExtMeth.dll")]</b>
<b> public extern static int AbsMax(int a, int b);</b>
<b> static void Main() {</b>
<b> // Использовать внешний метод,</b>
<b> int max = AbsMax(-10, -20);</b>
<b> Console.WriteLine(max);</b>
<b> }</b>
<b>}</b>
Обратите внимание на использование атрибута DllImport в приведенной выше программе. Он уведомляет компилятор о наличии библиотеки DLL, содержащей внешний метод AbsMax(). В данном случае это файл ExtMeth.dll, созданный во время компиляции файла с исходным текстом метода AbsMax() на С. В результате выполнения данной программы на экран, как и ожидалось, выводится значение 20.
Во втором применении ключевое слово extern предоставляет псевдоним для внешней сборки, что полезно в тех случаях, когда в состав программы включаются две отдельные сборки с одним и тем же именем элемента. Так, если в сборке test1 содержится класс MyClass, а в сборке test2 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт.
Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора /г, как в приведенном ниже примере.
<b>/г:Asm1=test1 /г:Asm2=test2</b>
А на втором этапе необходимо ввести операторы с ключевым словом extern, в которых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такого оператора для создания псевдонима сборки.
<b>extern alias имя_сборки;</b>
Если продолжить приведенный выше пример, то в программе должны появиться следующие строки кода.
<b>extern alias Asml;</b>
<b>extern alias Asm2;</b>
Теперь оба варианта класса MyClass будут доступны в программе по соответствующему псевдониму.
Рассмотрим полноценный пример программы, в которой демонстрируется применение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл — test1.cs.
<b>using System;</b>
<b>namespace MyNS {</b>
<b> public class MyClass {</b>
<b> public MyClass() {</b>
<b> Console.WriteLine("Конструирование из файла MyClassl.dll.");</b>
<b> }</b>
<b> }</b>
<b>}</b>
Далее следует исходный текст из файла test2.cs.
<b>using System;</b>
<b>namespace MyNS {</b>
<b> public class MyClass {</b>
<b> public MyClass() {</b>
<b> Console.WriteLine("Конструирование из файла MyClass2.dll.");</b>