- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания C# 4.0: полное руководство - Герберт Шилдт
Шрифт:
Интервал:
Закладка:
В первом своем применении ключевое слово extern было доступно с момента создания С#. Оно обозначает, что метод предоставляется в неуправляемом коде, который не является составной частью программы. Иными словами, метод предоставляется внешним кодом.
Для того чтобы объявить метод как внешний, достаточно указать в самом начале его объявления модификатор extern. Таким образом, общая форма объявления внешнего метода выглядит следующим образом.
extern возвращаемый_тип имя_метода (список_аргументов) ;
Обратите внимание на отсутствие фигурных скобок.
В данном варианте ключевое слово extern нередко применяется вместе с атрибутом DllImport, обозначающим библиотеку DLL, в которой содержится внешний метод. Атрибут DllImport принадлежит пространству имен System.Runtime.InteropServices. Он допускает несколько вариантов, но, как правило, достаточно указать лишь имя библиотеки DLL, в которой содержится внешний метод. Вообще говоря, внешние методы следует программировать на С. (Если же это делается на C++, то имя внешнего метода может быть изменено в библиотеке DLL путем дополнительного оформления типов.)
Для того чтобы стало понятнее, как пользоваться внешними методами, обратимся к примеру конкретной программы, состоящей из двух файлов. Ниже приведен исходный код С из первого файла ExtMeth.с, где определяется метод AbsMax().
#include <stdlib.h>
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 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт.
Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора /г, как в приведенном ниже примере.
/г: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
В этой строке кода первым указывается псевдоним, затем оператор разрешения пространства имен, далее имя пространства имен, в котором находится класс с неоднозначным именем, и, наконец, имя самого класса, следующее после оператора-точки. Та же самая общая форма пригодна и для других внешних псевдонимов.
Ниже приведен результат выполнения данной программы.
Конструирование из файла MyClassl.dll.
Конструирование из файла MyClass2.dll.
ЧАСТЬ 2 Библиотека C#
В части II рассматривается библиотека С#. Как пояснялось в части I, используемая в C# библиотека на самом деле является библиотекой классов для среды .NET Framework. Поэтому материал этой части книги имеет отношение не только к языку С#, но и ко всей среде .NET Framework в целом.
Библиотека классов для среды .NET Framework организована по пространствам имен. Для использования отдельной части этой библиотеки, как правило, достаточно импортировать ее пространство имен, указав его с помощью директивы using в исходном тексте программы. Конечно, ничто не мешает определить имя отдельного элемента библиотеки полностью вместе с его пространством имен, но ведь намного проще импортировать сразу все пространство имен.