Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 234

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 228 229 230 231 232 233 < 234 > 235 236 237 238 239 240 .. 320 >> Следующая

580 Глава 12 • Взаимодействие с унаследованным программным кодом
Код приложения CSharpLulеВоишІСІкчП можно найти в подкаталоге Chapter 12.
тод — Get I DsGf Names (). Он позволяет клиенту, применяющему метод позднего связывания, получать числовое значение (DISPID), используемое для идентификации метода, который клиент собирается вызвать.
В COM IDL идентификатор DISPID для члена назначается при помощи атрибута [id]. Если мы обратимся при помощи OLE/COM Object Viewer к коду IDL, который был сгенерирован для нашего СОМ-сервера средой Visual Basic, мы сможем увидеть DISPID для метода AcJcK );
rid<0x60030000)] HRESULT Add( [in] short х, [in] short у, [out. retval] short* ):
Числовое значение, помеченное атрибутом [id], — это именно то, что метод GetlDsOfNamesO возвратит клиенту, применяющему метод позднего связывания. Получив это значение, клиент сможет воспользоваться вторым интересующим нас методом - Invoke(). Этот метод интерфейса I Dispatch принимает несколько параметров, один из которых — DISPID вызываемого метода.
Кроме того, метод Invokeu принимает массив типов COM VARIANT, представляющих параметры, передаваемые методу. В ситуации с методом Add С) этот массив будет содержать два значения типа short. Последний параметр — это еще
один тип VARIANT, который будет представлять возвращаемое клиенту значение (в нашем случае опять-таки short).
Клиент .NET, использующий позднее связывание, применяет вышеописанную схему, конечно, не напрямую (напрямую без RCW он не может обратиться к СОМ-серверу), а при помощи типов из пространства имен System.Reflection. Давайте создадим еще один клиент С#, который будет использовать позднее связывание для вызова метода Add О. Обратите внимание, что этому приложению уже не будут нужны никакие промежуточные сборки, создаваемые при помощи утилиты tLbimp.exe:
using System:
using System. Reflection:
-uDiic class ute?mder (
public static int Main(string[] args)
{
Il Вначале получаем ссыпку на интерфейс IDispatch от сокласса
Type саlcObj -
Type.GetTypeFromProgID("Pa і nful IySi mpl eVBCOMServer.CoCaIc"):
object calcDisp - Act1 vator. CreatelnstanceCcalcObj>:
II Создаем массив параметров Qbject[] add Args - { 100. 34 };
// Вызываем нетод.АсісК) и получаем результат object sum = null:
sum - calcObj.InvokeMemberC'Add". BindingFlags.InvokeMethod. null,
calcDisp. addArgs);
// Выводим результат
Console.WriteLinet"Late bound adding:\nlOD + 24 is: (0Г. sum): return 0:
Особенности созданной нами сборки 581
Особенности созданной нами сборки
Теперь, когда мы познакомились с тем, как можно обращаться к СОгМ-сернеру из кода .NKT1 необходимо уточнить некоторые важные детали. Давайте загрузим созданную нами при помощиtlbimp.exe сборку ¦. ¦в ILDasm,е> ї и рассмотрим повнимательнее ее содержимое (точнее, содержимое ее манифеста). Как и в любой сборке, мы сможем обнаружить в ней ссылку на сборку mscorLib.dLL (библиотеку базовых классов .NET), за которой следует информация о версии.
Действительно неожиданные вещи обнаруживаются при обращении катрибу • там .КЕТ. Среди них можно встретить ссылки на типы GuldAttribute и Imported-
посмотрим значение то сможем заметить жестко прописанный в файловой системе путь к СОМ-серверу (рис. 12.11).
MANIFEST

I 34 30 37 II . .$4d4702a6-3407
31 61 39 tt -4aaO-albO-fi21a9
// df477ee..
3 68 61 72 70 42 6F Ef 6В //
і BJ 7C 7* 65 12 № : і 32 II \Lab3\Chaptec 12
бС 79 53 69 6D 70 6C 65 // \PeinfullySlmple
2 76 65 72 5C 50 БІ 69 6E // VBCOMSetrve t:\Pair.
0 70 6C 65 56 42 43 4D // fullySiropleVBCOJ
•1 6C 6C 00 00 1 // Server.
J
Lu
ІРис. 12.11. Путь в файловой системе к двоичному файлу СОМ-сервера жестко определен в сборке как значение атрибута ImportedFramTypeubAttribute
Из этого следует грустный вывод: если СОМ-сервер будет перемещен в другое место или переименован, наше приложение перестанет работать. Для восстановления работоспособности нам придется заново создавать SImpleAssembly.dll.
И еще один момент, на который можно обратить внимание. На рис. 12.12 представлено значение атрибута GuldAttribute.
F МДГ1М5Ї

33 34 30 37 /; ..S4d4702a6 SEf і
32 31 61 39 // -4аа0-а1Ь0- ш
// df477ee. .¦
53 68 61 72 70 42 6P 6B .
68 61 70 65 72 20 31 // \Labe\Chepfcer» 12
6C Cc 79 53 69 61 70 SC 65 // \PadLnfully31mple
72 76 65 72 5C 50 61 69 6E // VBCOMServer\Palri
6D 70 6C 65 56 42 43 4F 4D // f ullySjjnplaVBCOM
64 6C 6C 00 00 ) // Server.dll.. _j
IVfS
Рис. 12.12. Значение атрибута GuidAttnbute — это GUID СОМ-сервера
582 Глава 12 • Взаимодействие с унаследованным программным кодом
Это значение — именно которое Visual Basic использовал в качестве GUID для библиотеки типов (LlBID). Если мы откроем наш СОМ-сервер в OLE/COM Object Viewer, то вы сможете убедиться, что это именно так (рис. 12.13).
, OLE COM Viewer


IS B F'«3*Trwii№ ¦> I ffl-fc ffl-'lfe PaoaTransltir/ ffl«bR*W»»ySrSri' H0115, P»rttiVSifr*^COMS«vei.CcCak; :M (D1016E0C.B6O9-4i:40-961A-36512lC«AF1) Вг»Лї MmpternenteUen | | Launch Permssions j tvxjl±l
Предыдущая << 1 .. 228 229 230 231 232 233 < 234 > 235 236 237 238 239 240 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100