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

 

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

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

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 243 244 245 246 247 248 < 249 > 250 251 252 253 254 255 .. 320 >> Следующая

Интерфейс класса для самого класса Deri vedCl ass также представляет интерес. Вспомним, что в исходном определении этого класса в С# была предусмотрена перегрузка одного из методов. Поскольку в СОМ перегрузка методов в принципе не то tlbexp.exe приходится использовать радикальные средства:
interface _Ceriv«JClass : IDispatch {
II Методы интерфейса _0bject...
II Методы, "унаследованные от базового класса"
[id(0x60020004)3 HRESULT VirMethodO:
[id(0x60020005). propget] HRESULT fieldOne([out. retval] BSTR* pRetVal): [id(0x60020005). propput] HRESULT fieldOne([in] BSTR pRetVal):
II "Перегруженный метод" [id(0x6O0200O7)] HRESULT SomeMethodO; [id(0x6002000a)] HRESULT SomeMethod_2([in] longx); [id(0x600200Q9)] HRESULT SomeMethod_3([in] long x, [in] VARIANT o); [id(0x60Q20O0a)] HRESULT SomeMethod_4([in] long x, [in] single f):
Il Переменная FleldTwo, определенная как public (поле) •
[id(Ox6002000bJ. propget] HRESULT fieldTwo([out. retval] single* pRetVal):
[id(0x6002000c). propput] HRESULT fieldtwo([in] single pRetVal);
\;
Итак, провести преобразование таким образом, чтобы все действительно было гладко, не удалось. Вместо одного перегруженного метода SomeMethod С 3 у нас появилось целых четыре, при этом три — с числовыми суффиксами, то есть именами, которые мы им не присваивали. Конечно, это не единственное нарушение, которое может произойти при создании модуля CCW для типа .NET. Подобное безобразие можно будет наблюдать и при использовании вложенных пространств имен, абстрактных базовых классов, структурных типов (перечислений и структур) и т. д. Однако мы не будем углубляться в эти вопросы. Мы познакомились с
основными моментами и приемами а остальную информацию вы смо-
жете получить сами — при помощи электронной документации и путем анализа созданных для ваших типов .NET модулей CCW. Очень рекомендую вам использовать для такого анализа сборку CarLibrary.d!l созданную нами в главе 6... однако мы увлеклись.
Код приложения NctToComIssues можно найти в подкаталоге Chapter 12.
Управление процессом генерации кода IDL (как повлиять на то, что делает утилита tlbexp.exe)
При использовании утилиты для генерации прокси-сборки в манифест
этой сборки помещается большое количество атрибутов. Если мы создаем сборку
618 Глава 12 * Взаимодействие с унаследованным программным кодом
.N1ET1 к которой, как планируется, будут активно обращаться традиционные клиенты СОМ, мы также можем использовать множество атрибутов (один из них — ClassInterfaceAttribute - мы уже рассматривали). Обычно эти атрибуты используются для того, чтобы управлять процессом создания модуля CCW утилитой tLbimp.exe.
Давайте, как обычно, продемонстрируем применение таких атрибутов на примере. Мы создадим новое пространство имен (Att г і bDot NetObjects), в котором будет определен единственный интерфейс IBasicHath и единственный класс CaIc Обратите внимание на то, как мы будем использовать в этом пространстве имен атрибуты. При помощи них мы сможем явно определить значение GUIO для генерируемых типов и вмешаться в процесс создания аналогов СОМ для интерфейса IBasicMath и метода Add(). Кроме того, атрибуты будут использованы и для управления процессом представления двух статических функций, определенных в классе CaI с. Вот код пространства имен с атрибутами:
namespace AttribDotNetObjects
{
using System;
using System.Runtime.InteropServices: using System.Windows. Forms;
II Для этого интерфейса .NET мы применяем несколько атрибутов. Они будут // использованы утилитой t1bexp.exe при генерации модуля CCW [Gui dAttribute(° 47430ЕО 6-718 D-42С6-9Е45-7аА9967ЭС43См),
Interf aceTypeAttr і bute( Cottil nterf асеТуре. Interf a eel sDua 1) ] public interface IBasicMath {
[Displd(777)] int AdCdnt x. int y);
}
[GuidAttribute("C08F4261-C0C0-46AC-87F3-EDE306984ACC")]
public class DotNetCalc : IBasicMath
{
public DotNetCalcC)()
public int AddCint x. int y) { return x + y; }
It Этот атрибут означает, что данный метод должен быть вызван
/•/ при регистрации модуля CCW
[ComRegisterFunctionAttri bute]
public static void AddExtraRegLog-xfstrincj regLoc)
{
Il Выполняем дополнительные дейі :. при регистрации Мє s sageBox. Show С" I ns і de AddExt raLogi с ГШ", ".NET assembly
says:"):
}
в Этот атрибут означает, что данный нетод будет вызван при удалении
// регистрации модуля CCW
[ComUnregisterFunctionAttribute]
public static void Rernove?4tr=RegLogic(string regLoc)
{
Il Выполняем дополнительные действия при удалении регистрации
Управление регистрацией промежуточного модуля 619
// Полученный код IDL:
[odl, uuidC47430E06-7ieD-42C6-9E45-78A99673C43C). dual.. Oleautomation. custom({0F21F359-
AB84-41E8-9A78-36D110E6D2F9}. "AttribDotNetObjects.IBasicMath")] interface lBasicWtt : IDispatch {
[id(uxOOOOQ3Q9)] // У нас было: [Displd(777)]
HRESUtT AddC [in] long x, [in] long y. [out. retval] long* pRetVal):
}:
Если мы вернемся к представлению интерфейса IBasicMath в коде С# и изменим значение атрибута InterfaceTypeAttribute следующим образом:
Предыдущая << 1 .. 243 244 245 246 247 248 < 249 > 250 251 252 253 254 255 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100