Перенесення рішень із платформи com на платформу. Net 2006 Зміст


НазваПеренесення рішень із платформи com на платформу. Net 2006 Зміст
Дата конвертації15.04.2013
Розмір445 b.
ТипПрезентации


Перенесення рішень із платформи COM на платформу .NET

  • 2006


Зміст

  • 1. Ключова проблема перенесення рішень із COM у .NET.

  • 2. Раннє зв'язування. (Статичні виклики COM-об'єктів.)

  • 3. Отримання класів-proxy:

    • автоматичне імпортування бібліотеки типів COM ;
    • опис proxy-класів "вручну”.
  • 4. Конвертування типів даних при взаємодії .NET-COM.

  • 5. Пізнє зв'язування. (Динамічні виклики COM-об'єктів.)



Компоненти

  • Компонент – це відчужений виконуваний бінарний код, до якого, як правило, додатково ставляться наступні вимоги:

    • компонент характеризується кількома публічними інтерфейсами як своєрідними контрактами стосовно функціональності, реалізацію якої такий компонент гарантує;
    • компонент містить вичерпні дані про самого себе (зокрема, про підтримувані ним інтерфейси) та надає можливість доступу до цих даних (у .NET такі властивості описуються в термінології метаданих та механізму рефлексії).


Ключова проблема

  • Загалом, серед проблем, пов'язаних із перенесенням рішень із платформи COM на платформу .NET, ключовою є наступна:

      • Чи можливо, а якщо можливо, то як саме використовувати COM-об'єкти у .NET-проектах?
  • У багатьох випадках (але не завжди) для вирішення означеної проблеми використовуються засоби імпортування компонентів COM, коли кокласам COM ставляться у відповідність класи .NET, що виконують роль proxy.

  • Для такого імпортування Microsoft надає інструментальні засоби, які спираються на бібліотеки типів компонентів COM.

  • Часто імпортування при розробці .NET-проектів виділяється як окремий крок, пов'язаний із генерацією за бібліотекою типів NET-збірки. Такий підхід, зокрема, дозволяє вирішити проблему раннього зв'язування з COM-об'єктами.



Раннє зв'язування. (Статичні виклики COM-об'єктів.)

  • Нагадаємо, що це випадок, коли при розробленні клієнтської програми (зокрема, зараз нас цікавить розроблення клієнтської .NET-програми) наперед відомо, які саме (серверні) COM-об'єкти вона може використовувати.

  • Схема раннього зв'язування .NET-проектів з COM-об'єктами:



Раннє зв'язування. Обгортка RCW

  • Під час створення у .NET-середовищі об'єкта, який виступає у ролі proxy стосовно COM-об'єкта, віртуальна машина "дізнається", що даний .NET-об'єкт є імпортованим з COM (в .NET-описах proxy-класів для цього застосовується спеціальний прапорець імпорту; принагідно зауважимо, що у мові IL-асемблера для встановлення такого прапорця імпорту COM можна скористатись спеціфікатором import, а у мовах високого рівня – атрибутом ComImport).

  • Тому, "дізнавшись" про імпортованість, віртуальна машина разом зі створенням .NET-об'єкта (proxy) додатково генерує спряжені з ним обгортку RCW та власне COM-об'єкт.

  • Яку роль відіграє обгортка RCW (Runtime Callable Wrapper)? Ця обгортка, по-перше, інкапсулює роботу зі стандартними COM-інтерфейсами: IUnknown, IDispatch та деякими іншими (проте не з усіма, серед таких, наприклад, ITypeInfo) і, по-друге, відповідає за маршалінг даних між двома різними середовищами.



Обгортка RCW



Варіанти отримання класів-proxy.

    • Автоматичне імпортування бібліотеки типів COM (із генерацію збірки з описами класів-proxy):
      • використання утиліти TlbImp.exe (Type Library Importer): TlbImp.exe /out:NET_s_inproc.dll s_inproc.dll;
      • імпортування бібліотеки типів безпосередньо у середовищі Microsoft Visual Studio .NET. Два сценарії "підключення" компонента COM до C#-проекту:
        • (вікно) Solution Explorer проекту => пункт Reference => ПКМ => (контекстне меню) AddReference => (закладка) COM;
        • (меню) Project => AddReference => (закладка) COM.
      • Для обох сценаріїв при "підключенні”, наприклад, inproc COM-сервера s_inproc.dll у .NET-проекті буде згенерована збірка (з proxy-класами) з іменем Interop.s_inproc.dll.
    • Опис класів-proxy "вручну" з використанням декларативних засобів програмування у .NET.


Приклад. Inproc COM-сервер s_inproc.dll

  • Опис COM-інтерфейсу Icomnet (із unit s_inproc_TLB.pas): Icomnet = (IDispatch) ['{CAAB7D60-5135-46F1-A6BB-D82B38EB2D77}'] procedure hi; safecall; function conv(usd: Double): Double; safecall; function ww(const w: WideString): WideString; safecall; end;



s_inproc.tlb (вигляд в Oleview.exe) та інтерфейс Icomnet

  • Опис COM-інтерфейсу Icomnet (із unit s_inproc_TLB.pas): Icomnet = (IDispatch) ['{CAAB7D60-5135-46F1-A6BB-D82B38EB2D77}'] procedure hi; safecall; function conv(usd: Double): Double; safecall; function ww(const w: WideString): WideString; safecall; end;



Приклад. (Файл NET_Client.cs клієнтського проекту)

  • using System;

  • using NET_s_inproc; // простір імен, що містить згенеровані за кокласом comnet

  • // .NET-клас comnetClass (клас-proxy) та .NET-інтерфейс comnet

  • class App

  • {

  • public static void Main()

  • {

  • comnet NET_Ob = new comnet(); // Зауважимо, що формально

  • // comnet - це .NET-інтерфейс!

  • Console.WriteLine(NET_Ob.ww("Abc"));

  • Console.WriteLine(NET_Ob.conv(11));

  • NET_Ob.hi();

  • }

  • }



Збірка NET_s_inproc.dll. (Перегляд в ildasm.exe)



Імпортовані методи conv та ww у .NET_s_inproc.dll. (Перегляд з ILDasm.exe )



Файл NET_Client.il (результат дизасемблювання).

  • {

  • .entrypoint

  • // Code size 49 (0x31)

  • .maxstack 2

  • .locals init (class [NET_s_inproc]NET_s_inproc.comnet V_0)

  • IL_0000: newobj instance void [NET_s_inproc]NET_s_inproc. comnetClass ::.ctor()

  • IL_0005: stloc.0

  • IL_0006: ldloc.0

  • IL_0007: ldstr "Abc"

  • IL_000c: callvirt instance string [NET_s_inproc]NET_s_inproc.Icomnet::ww(string)

  • IL_0011: call void [mscorlib]System.Console::WriteLine(string)

  • IL_0016: ldloc.0

  • IL_0017: ldc.r8 11.

  • IL_0020: callvirt instance float64 [NET_s_inproc]NET_s_inproc.Icomnet::conv(float64)

  • IL_0025: call void [mscorlib]System.Console::WriteLine(float64)

  • IL_002a: ldloc.0

  • IL_002b: callvirt instance void [NET_s_inproc]NET_s_inproc.Icomnet::hi()

  • IL_0030: ret

  • } // end of method App::Main



Опис proxy-класів "вручну”

  • // файли Net_Client2_Hi.cs та Net_Client2_Hi_a.cs (варіант 2)

  • using System;

  • using System.Runtime.InteropServices;

  • [ ComImport, // Специфікується імпортування з COM

  • // (у даному випадку імпортується інтерфейс).

  • // Guid призначеного для імпортування COM-інтерфейсу Icomnet.

  • Guid("CAAB7D60-5135-46F1-A6BB-D82B38EB2D77"),

  • // Тип COM-інтерфейсу Icomnet.

  • // Варіанти (перелічення) типів COM-інтерфейсів:

  • // InterfaceIsIDispatch, InterfaceIsIUnknown, InterfaceIsDual.

  • InterfaceType(ComInterfaceType.InterfaceIsIDispatch),

  • ]

  • interface INET_comnet1

  • // Допоміжний “звужений” .NET-інтерфейс, спряжений з COM-інтерфейсом Icomnet.

  • {

  • void Hi();

  • };



Опис proxy-класів "вручну” (прод.)

  • [ ComImport, // Специфікується імпортування з COM

  • // (у даному випадку імпортується коклас).

  • Guid("B66CF79A-6A91-457C-AFA5-C73838725121") // Guid кокласу comnet

  • ]

  • class NET_proxy // власне proxy-клас, спряжений з кокласом comnet

  • {

  • };

  • class App

  • {

  • public static void Main()

  • {

  • NET_proxy obj = new NET_proxy();

  • INET_comnet1 interfaceNET = (INET_comnet1) obj;

  • interfaceNET.Hi();

  • }

  • }



Конвертування типів даних при взаємодії .NET-COM. Ізоморфні типи

  • Ізоморфні пари типів NET/MIDL (вони не потребують стекових перетворень):

  • Single float,

  • Double double,

  • Sbyte signed char,

  • Byte unsigned short,

  • Int16 short,

  • UInt16 unsigned short,

  • Int32 long,

  • UInt32 unsigned long,

  • Int64 __int64,

  • UInt64 unsigned __int64,

  • IntPtr INT_PTR,

  • UIntPtr UINT_PTR.

  • Ізоморфними вважаються також утворені з наведених ізоморфних типів деякі складені типи: одновимірні масиви, структури, які описуються з атрибутом [StructLayout(LayoutKind.Sequential)].



Конвертування типів даних при взаємодії .NET-COM

  • Конвертування типів у напрямку з IDL у .NET визначається однозначно, а от у напрямку з .NET у IDL – неоднозначно.

  • Наведемо для прикладу кілька правил можливого конвертування типів з .NET в IDL:

  • Для обрання конкретного варіанта конвертування типів можна скористатись атрибутом MarshalAsAttribute (або просто MarshalAs).



Конвертування типів даних при взаємодії .NET-COM. Атрибут MarshalAs

  • Атрибут MarshalAs може застосовуватись до параметрів і результатів методів, а також до полів структур чи класів. (Цей атрибут не є обов'язковим, тому що для кожного типу даних є варіант конвертування за замовчуванням).

  • MarshalAsAttribute має один обов'язковий позиційний параметр:

  • public MarshalAsAttribute (UnmanageType unmanageType).

  • Приклад:

  • [return : MarshalAs(UnmanagedType.Interface)]

  • Object F([MarshalAs(UnmanagedType.BStr)] String str)



Деякі члени з перелічення (enumeration) UnmanageType

  • Приклад:

  • [return : MarshalAs(UnmanagedType.Interface)]

  • Object F([MarshalAs(UnmanagedType.BStr)] String str)



Приклад програми з MarshalAs (фрагменти)

  • // файл Net_Client2_ww.cs

  • // див. для порівняння файл Net_Client2_Hi.cs (Опис proxy-класів "вручну”)

  • interface INET_comnet2 // Допоміжний “звужений” .NET-інтерфейс,

  • // спряжений з COM-інтерфейсом Icomnet.

  • {

  • [return : MarshalAs(UnmanagedType.BStr)]

  • String ww([MarshalAs(UnmanagedType.BStr)][In] String w);

  • };

  • . . .

  • public static void Main()

  • {

  • NET_proxy obj = new NET_proxy();

  • INET_comnet2 interfaceNET = (INET_comnet2)obj;

  • Console.WriteLine( interfaceNET.ww("Abcde"));

  • Console.ReadLine();

  • }



Специфікація напрямку передачі параметрів

  • Специфікація параметрів за напрямком передачі даних. Для специфікації напрямку передачі параметрів у середовищі .NET використовуються у C# ключові слова out та ref:

  • Атрибути напрямку маршалінгу для фактичних параметрів. Для забезпечення маршалінгу фактичних параметрів між різними середовищами необхідно використовувати атрибути: InAttribute (або просто In), OutAttribute (або просто Out). Ці атрибути можуть застосовуватись до параметрів одночасно. (Атрибути In та Out відображаються також у коді IL-асемблера.)

  • Приклад:

  • Void F([Out] out Double p1).



Атрибути напрямку маршалінгу в коді IL-асемблера



Пізнє зв'язування. (Динамічні виклики COM-об'єктів.)

  • Класичний випадок пізнього зв'язування описується ситуацією, коли при розробленні клієнтської програми (зокрема, клієнтської .NET-програми) програмісту в принципі не відомо, які саме серверні COM-об'єкти у програмі можуть бути використані. Тобто програміст повинен забезпечити деякі “універсальні” засоби на зразок браузера бібліотек типів, із можливістю активізації обраного кокласу та “запуском” його методів.

  • Варто також згадати варіант таких COM-компонент, із якими не надається бібліотека типів (у будь-якому вигляді). Зрозуміло, що у даному випадку розглянуті раніше підходи до зв'язування принципово не можливі, а отже, залишається розраховувати тільки на пізнє зв'язування.

  • У CLR для реалізації динамічних викликів (пізнього зв'язування) використовується механізм рефлексії.



Пізнє зв'язування. Приклад. (Файл Net_Client_Reflection.cs)

  • using System;

  • using System.Reflection;

  • class App

  • {

  • public static void Main()

  • {

  • Type NET_Type_comnet = Type.GetTypeFromProgID("s_inproc.comnet");

  • // є й інші можливості отримати тип, зокрема, використати статичний метод

  • // public static Type Type.GetTypeFromCLSID(Guid clsid);

  • Object obj = Activator.CreateInstance(NET_Type_comnet );

  • NET_Type_comnet.InvokeMember(

  • "Hi", // string name // Ім'я члена класу (у даному випадку - ім'я метода)

  • BindingFlags.InvokeMethod,// BindingFlags invokeAttr // Прапорець зв'язування:

  • // виконати метод, встановити чи прочитати властивість тощо.

  • // У даному випадку - виконати метод.

  • null, // Binder binder // Параметр використовується в особливих випадках зв'язувань

  • obj, // object target // Цільовий об'єкт.

  • // (У даному випадку згенерований об'єкт, і викликатиметься його метод Hi.

  • new object[0] // Параметри. У даному випадку параметри відсутні (0 параметрів).

  • );

  • }

  • };



Додаток



Реалізація inproc COM-сервера s_inproc.dll



Фрагменти (не керованої) клієнтської програми з використанням inproc COM-сервера s_inproc.dll.

  • var V:variant;

  • V:= CreateOleObject('s_inproc.comnet');

  • . . .

  • Temp:=StrToFloat(Edit1.text);

  • Res:=V.Conv(Temp);

  • Label1.Caption:= floattostr(Res)+ ' UAG';

  • . . .

  • V.hi;

  • . . .

  • Label4.Caption:= V.ww(Edit2.text);



Виконання клієнтської програми



Схожі:

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconПеренесення рішень із платформи. Net на платформу com 2006 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconДо перенесення рішень із платформи. Net на платформу com 2010-2011 Створення бібліотеки класів (під com)

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови платформи. Net framework 2006-2012 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови платформи. Net framework 2006 Зміст
Розробка платформи почалася у 1998 році. Перша робоча назва Project 42, потім була назва com object Runtime чи, скорочено, cor, пізніше...
Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови платформи. Net framework 2007 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови віддаленої взаємодії об'єктів. Net (. Net remoting) 2006-2009 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови віддаленої взаємодії об'єктів. Net (. Net remoting) 2006 Зміст
На цьому ґрунтується захист: збій в одному домені не впливає на інші домени, навіть у тому ж процесі. Зауважимо, що реальний процес...
Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови віддаленої взаємодії об'єктів. Net (. Net remoting) 2009 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови віддаленої взаємодії об'єктів. Net (. Net remoting) 2007 Зміст

Перенесення рішень із платформи com на платформу. Net 2006 Зміст iconОснови віддаленої взаємодії об'єктів. Net (. Net remoting) 2008 Зміст


Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка