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

 

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

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

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

Private Sub btnDoEverythі ng_Cl і CkО On Error GoTo OOPS:
'Создаем объект .MET и складываек два числа
' Dim о As New CSharpCalc MsgBox o.AddOO. ЗО), . "Adding"
' Вызываем некоторые методы интерфейса _0bject MsgBox o.ToString, , "То String" MsgBox o.GetHashCode. , "Hash code"
Dim t As Object Set t = 0.GetTypeO MsgBox t, , "Type"
! Получаем ссыпку на пользовательский интерфейс ' и заставляем сработать исключение Dim i As lAdvancedMath Set і - О
MsgBox i.Mult1ply(4. 22), . "Multiply"
MsgBox i.Divide(20. 2), . "Divide"
MsgBox i.Divlde(20. 0) 1 Генерируем ошибку
OOPS:
1 Выводим информацию об исключении ¦MsgBox Err.Description, . "Error!"
End Sub
Обратите внимание, что Visual Basic 6.0 не позволяет получить доступ к интерфейсу _Туре, возвращаемому при помощи метода_0Ьл'есС GetType(), поскольку этот интерфейс помечен как скрытый ([hidden]). Вместо этого придется ограничиться гораздо более скромными возможностями System.Object.
Код приложения VBDotNetClient можно найти в подкаталоге Chapter 12.
Некоторые особенности отображения типов .NfTT в СОМ 615
Некоторые особенности отображения типов .NETb СОМ
Общая система типов (Common Type System, CTS) допускает применение некоторых возможностей, которые в СОМ не предусмотрены. Например, классы С# могут поддерживать любое количество конструкторов, перегруженных операторов, перегруженных методов. Кроме того, для классов С# может использоваться классическое наследование. Однако ни одна из этих технологий программирования не может использоваться в СОМ. Как же производится перевод типов .NET, в которых используются такие возможности, в типы СОМ при создании промежуточного модуля CCW утилитой ttbexp.exe? Все не так просто.
Давайте рассмотрим такое представление на примере. Предположим, что у нас есть библиотека кода С#, в которой определен один базовый класс и один производный класс. В базовом классе есть переменные, определенные как publ і с (поля),
набор конструкторов и единственный виртуальный метод:
(Ci assiriterfaceiCioSilnterfaceType. AuloPuoI )1
public class BaseClass
{
// Переменные
private int memberVar;
public string fieldOne;
II Конструкторы
public BaseClassOf}
public BaseClasstint m, string f)
{ memberVaI = m: fieldOne = f; }
Il Виртуальный нетод
public virtual void VirMethodO
{ Console.WriteLineC'Base VirMethod impl"):}
}
Производный класс замещает виртуальный метод и определяет еще один метод, который несколько раз перегружен:
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DonveoClass : BaseClass
{
Il Переменная
public float fieldTwo;
¦
Il Конструктор
Derived Classtint m. string f) : basetm, f) {}
// Замещенный нетод
public override void VirMethodO {
Console.WriteL1ne{""Der1ved VirMethod impl"); base.VirMethodt);
II Перегруженные члены public void SomeMetnodOO public void SomeMethodCint x}{)
616 Глава 12 • Взаимодействие с унаследованным программным кодом
public void SomeMethodtint х. object о){} public void SomeMethodtint х. float f){j
)
Вобщем, нам совершенно не важно, что именно делают все эти методы. Гораздо интереснее выяснить, как утилита tLbexp.exe выкрутится из сложной ситуации и создаст для этих конструкций .NET аналоги СОМ.
Анализ кода сгенерированного
для базового класса
Давайте начнем с определения сокласса для базового класса .NET (который у нас называется BaseClass). Для этого загрузим сгенерированный файл * .Ubв OLE/COM Object Viewer и найдем там информацию о соклассе:
coclass BaseClass {
interface IManagedObject; [default] interface ,BaseClass; interface Jbject;
}:
Вряд ли здесь нужно что-то комментировать. Что такое интерфейс класса и для чего нужен интерфейс _0bject — это мы уже обсуждали. Действительно интересные вещи обнаруживаются в определении самого интерфейса класса:
Interface _BaseClass : IDispatch {
// Методы обьекта...
[id(0x60020004)] HRESUCT VirMethodO :
[id(0x60020005). propget] HRESULT f і el dOneC [out. retval] BSTR* pRetVal): [id(0x60020005). propput] HRESULT field0ne([in] BSTR pRetVal):
h
Таким образом, переменные, объявленные как public (то есть поля), представлены в сгенерированной сборке как свойства СОМ. Это вполне объяснимо, поскольку клиенты СОМ никогда не получают ссылки на объекты и им всегда приходится работать через ссылки на интерфейсы. А теперь посмотрим, что создано для производного класса.
Анализ кода сгенерированного для производного класса
Как известно, никакого классического наследования между классами в СОМ не предусмотрено в принципе. Поэтому просто взять и перенести отношение "is-a" между базовым и производным классом не удастся при всем желании. Вместо этого утилита tLbexp.exe делает замечательный фокус: она реализует в соклассе, созданном для производного класса, интерфейс базового класса! Вот так:
coclass Den vedCl ass {
Interface IManagedObject: [default] interface _DerivedClass;
Interface BaseClass:
Управление процессом генерации кода IDL 617
interface Object:
}:
Такой подход га раї іти руст, что в производном классе будут реализованы те же возможности, что и в базовом.
Предыдущая << 1 .. 242 243 244 245 246 247 < 248 > 249 250 251 252 253 254 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100