Вход/Регистрация
Полное руководство. С# 4.0
вернуться

Шилдт Герберт

Шрифт:

extern возвращаемыйтип имяметода(список_аргументов); Обратите внимание на отсутствие фигурных скобок. В данном варианте ключевое слово extern нередко применяется вместе с атри бутом DllImport, обозначающим библиотеку DLL, в которой содержится внешний метод. Атрибут DllImport принадлежит пространству имен System.Runtime. InteropServices. Он допускает несколько вариантов, но, как правило, достаточно указать лишь имя библиотеки DLL, в которой содержится внешний метод. Вообще го воря, внешние методы следует программировать на С. (Если же это делается на С++, то имя внешнего метода может быть изменено в библиотеке DLL путем дополнительного оформления типов.) Для того чтобы стало понятнее, как пользоваться внешними методами, обратимся к примеру конкретной программы, состоящей из двух файлов. Ниже приведен ис ходный код С из первого файла ExtMeth.с, где определяется метод AbsMax. include

int __declspec(dllexport) AbsMax(int a, int b) { return abs(a) < abs(b) ? abs(b) : abs(a); } В методе AbsMax сравниваются абсолютные значения двух его параме тров и возвращается самое большое из них. Обратите внимание на обозначение _ declspec(dllexport). Это специальное расширение языка С для программных средств корпорации Microsoft. Оно уведомляет компилятор о необходимости экспор тировать метод AbsMax из библиотеки DLL, в которой он содержится. Для компи лирования файла ExtMeth.с в командной строке указывается следующее.

CL /LD /MD ExtMeth.с В итоге создается библиотечный файл DLL — ExtMeth.dll. Далее следует программа на С#, в которой применяется внешний метод AbsMax.

using System; using System.Runtime.InteropServices;

class ExternMeth { // Здесь объявляется внешний метод. [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 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт. Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, исполь зуя параметр компилятора /r, как в приведенном ниже примере.

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

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

extern alias Asm1; extern alias Asm2; Теперь оба варианта класса MyClass будут доступны в программе по соответствую щему псевдониму. Рассмотрим полноценный пример программы, в которой демонстрируется приме нение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл — test1.cs.

using System;

namespace MyNS { public class MyClass { public MyClass { Console.WriteLine("Конструирование из файла MyClass1.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 Asm1; 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 В этой строке кода первым указывается псевдоним, затем оператор разрешения пространства имен, далее имя пространства имен, в котором находится класс с неодно значным именем, и, наконец, имя самого класса, следующее после оператора-точки. Та же самая общая форма пригодна и для других внешних псевдонимов. Ниже приведен результат выполнения данной программы.

Конструирование из файла MyClass1.dll. Конструирование из файла MyClass2.dll. ```

ГЛАВА 21. Пространство имен System

  • Читать дальше
  • 1
  • ...
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: