Полное руководство. С# 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.cscsc /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
В этой главе речь пойдет о пространстве имен System.Это пространство имен самого верхнего уровня в библиотеке классов для среды .NET Framework. В немнепосредственно находятся те классы, структуры, интерфейсы, делегаты и перечисления, которые чаще всего применяются в программах на C# или же считаются неотъемлемой частью среды .NET Framework. Таким образом, пространство имен System составляет ядро рассматриваемойздесь библиотеки классов.
Кроме того, в пространство имен System входит многовложенных пространств имен, поддерживающих отдельные подсистемы, например System.Net. Некоторые изэтих пространств имен рассматриваются далее в этой книге. А в этой главе речь пойдет только о членах самого пространства имен System.Члены пространства имен System
Помимо большого количества классов исключений, в пространстве имен содержатся приведенные ниже классы.ActivationContextActivatorAppDomainAppDomainManagerAppDomainSetupApplicationldApplicationldentityArrayAssemblyLoadEventArgsAttributeAttributeUsageAttributeBitConverterBufferCharEnumeratorCLSCompliantAttributeConsoleConsoleCancelEventArgsContextBoundObjectContextStaticAttributeConvertDBNullDelegateEnumEnvironmentEventArgsExceptionFileStyleUriParserFlagsAttributeFtpStyleUriParserGCGenericUriParserGopherStyleUriParserHttpStyleUriParserLazy<T>Lazy<T, TMetadata>LdapStyleUriParserLoaderOptimizationAttributeLocalDataStoreSlotMarshalByRefObjectMathMTAThreadAttributeMulticastDelegateNetPipeStyleUriParserNetTcpStyleUriParserNewsStyleUriParserNonSerializedAttributeNullableObjectObsoleteAttributeOperatingSystemParamArrayAttributeRandomResolveEventArgsSerializableAttributeSTAThreadAttributeStringStringComparerThreadStaticAttri bute TimeZone TimeZonelnfoTimeZonelnfoAdjustmentRuleTuple Tuple<...> (различные формы)TypeUnhandledExceptionEventArgs UriUriBuilderUriParser UriTemplateUriTemplateEquivalenceComparerUriTemplateMatchUriTemplateTableUriTypeConverterValueTypeVersionWeakReference