49

Взаимодействие с неуправляван код

  • Upload
    taima

  • View
    83

  • Download
    16

Embed Size (px)

DESCRIPTION

Програмиране за .NET Framework. http:// www.nakov.com / dotnet-project /. Взаимодействие с неуправляван код. Мартин Кулов. Изпълнителен директор CodeAttest. www.codeattest.com. Необходими знания. Базови познания за общата система от типове в .NET (Common Type System) - PowerPoint PPT Presentation

Citation preview

Page 1: Взаимодействие с неуправляван код
Page 2: Взаимодействие с неуправляван код

ВзаимодействиеВзаимодействие с с неуправляван коднеуправляван код

Програмиране заПрограмиране за .NET Framework .NET Frameworkhttp://http://www.nakov.comwww.nakov.com//dotnet-projectdotnet-project//

Мартин КуловМартин КуловИзпълнителен директорИзпълнителен директорCodeAttestCodeAttestwww.codeattest.comwww.codeattest.com

Page 3: Взаимодействие с неуправляван код

Необходими знанияНеобходими знания Базови познания за общата система от Базови познания за общата система от

типове в типове в .NET (Common Type System).NET (Common Type System) Базови познания за езика Базови познания за езика C#C# Базови познания за езика Базови познания за езика C++C++ Базови познания за технологията Базови познания за технологията COMCOM Базови познания за програмиране под Базови познания за програмиране под

Win32 със C и C++Win32 със C и C++ Познания за атрибутите в .NETПознания за атрибутите в .NET Framework Framework

Page 4: Взаимодействие с неуправляван код

СъдържаниеСъдържание Какво е взаимодействие?Какво е взаимодействие? Платформено извикване (P/Invoke)Платформено извикване (P/Invoke)

Атрибут Атрибут DllImportDllImport Преобразуване на данни (marshalling)Преобразуване на данни (marshalling) Преобразуване на структуриПреобразуване на структури Преобразуване на класовеПреобразуване на класове Преобразуване на низовеПреобразуване на низове Атрибут Атрибут MarshalAsMarshalAs Имплементиране на функция за обратно Имплементиране на функция за обратно

извикванеизвикване

Page 5: Взаимодействие с неуправляван код

СъдържаниеСъдържание (2) (2) Взаимодействие с COMВзаимодействие с COM

Извикване на COM компонент от Извикване на COM компонент от управляван кодуправляван код

Runtime Callable Wrapper (RCW)Runtime Callable Wrapper (RCW) Разкриване на .NET компонент като COM Разкриване на .NET компонент като COM

компоненткомпонент COM Callable Wrapper (CCW)COM Callable Wrapper (CCW) Изисквания към .NET типове за Изисквания към .NET типове за

ползване от COMползване от COM Взаимодействие със C++ (IJW)Взаимодействие със C++ (IJW) Препоръки за използване на .NET Препоръки за използване на .NET

типове от COMтипове от COM

Page 6: Взаимодействие с неуправляван код

Какво е взаимодействие?Какво е взаимодействие? MicrosoftMicrosoft .NET Framework .NET Framework е е

сравнително нова технологиясравнително нова технология Съществува огромно количество Съществува огромно количество

готов неуправляван кодготов неуправляван код Предимствата на управлявания кодПредимствата на управлявания код

Безопасност на типоветеБезопасност на типовете Защита на паметтаЗащита на паметта Отражение на типоветеОтражение на типовете

Обща среда или виртуална машинаОбща среда или виртуална машина CLR CLR срещу срещу JVMJVM

Page 7: Взаимодействие с неуправляван код

.NET Framework.NET Framework

Среда за контролирано Среда за контролирано изпълнение изпълнение .NET .NET

Common LanguageCommon Language Runtime (CLR)Runtime (CLR)

.NET .NET приложениеприложение

Windows APIWindows APICOMCOMWindows KernelWindows Kernel

.NET Framework.NET FrameworkClass LibrariesClass Libraries

PlatformPlatformInteropInterop

Page 8: Взаимодействие с неуправляван код

Архитектурата на Архитектурата на JVMJVM

Java PlatformJava Platform

Java VirtualJava Virtual Machine (JVM)Machine (JVM)

Java Java приложениеприложение

Windows APIWindows APICOMCOMWindows KernelWindows Kernel

JavaJavaClass LibrariesClass Libraries

JNIJNI

Page 9: Взаимодействие с неуправляван код

Платформено извикване Платформено извикване (P/Invoke)(P/Invoke) Подходящ за сравнително прости Подходящ за сравнително прости

Windows Windows функции (функции (simple flat API)simple flat API) Подходящ за малък брой методи от Подходящ за малък брой методи от

неуправляван коднеуправляван код Атрибутът Атрибутът DllImportDllImport служи за служи за

извикване на неуправляван кодизвикване на неуправляван код За удобство За удобство DLL DLL функциите могат да функциите могат да

се организират в классе организират в клас

Page 10: Взаимодействие с неуправляван код

Атрибут Атрибут DllImportDllImport Използва се за дефиниране на връзка с Използва се за дефиниране на връзка с

неуправляван коднеуправляван код Прилага се върху методиПрилага се върху методи При конструиране се указва името на При конструиране се указва името на

DLL, който съдържа методаDLL, който съдържа метода Полето Полето EntryPointEntryPoint указва името на указва името на

извиквания методизвиквания метод Полето Полето CharSetCharSet определя как да се определя как да се

кодират символните низовекодират символните низове Полето Полето SetLastErrorSetLastError дава възможност дава възможност

за извличане на грешказа извличане на грешка

Page 11: Взаимодействие с неуправляван код

Как работи Как работи P/InvokeP/Invoke?? Намира и зарежда в паметта указания Намира и зарежда в паметта указания

DLLDLL (изпълнява се само веднъж) (изпълнява се само веднъж) Зарежда адреса на функцията, Зарежда адреса на функцията,

подава аргументите й и преобразува подава аргументите й и преобразува даннитеданните

Подава контрола на неуправлявания Подава контрола на неуправлявания кодкод

P/InvokeP/Invoke може да хвърли изключение може да хвърли изключение от неуправлявания кодот неуправлявания код

Page 12: Взаимодействие с неуправляван код

P/Invoke P/Invoke – пример– примерstatic IntPtr IDI_ASTERISK = (IntPtr) 32516;static IntPtr IDI_ASTERISK = (IntPtr) 32516;

[DllImport("user32.dll", EntryPoint="LoadIconW",[DllImport("user32.dll", EntryPoint="LoadIconW", ExactSpelling=true, CharSet=CharSet.Unicode)]ExactSpelling=true, CharSet=CharSet.Unicode)]public static extern IntPtr LoadPredefinedIcon(public static extern IntPtr LoadPredefinedIcon( IntPtr hinst, IntPtr icon);IntPtr hinst, IntPtr icon);

private void Form1_Load(object sender, private void Form1_Load(object sender, System.EventArgs e)System.EventArgs e)

{{ // извличаме манипулатора на системната икона// извличаме манипулатора на системната икона IntPtr hicon = LoadPredefinedIcon(IntPtr.Zero, IntPtr hicon = LoadPredefinedIcon(IntPtr.Zero,

IDI_ASTERISK);IDI_ASTERISK); // създаваме нов обект икона от получения манипулатор// създаваме нов обект икона от получения манипулатор Icon icon = Icon.FromHandle(hicon);Icon icon = Icon.FromHandle(hicon); // променяме иконата на главния прозорец// променяме иконата на главния прозорец this.Icon = (Icon) icon.Clone();this.Icon = (Icon) icon.Clone();}}

Page 13: Взаимодействие с неуправляван код

Командата Командата DUMPBINDUMPBIN Стартира се от командния редСтартира се от командния ред Част е от Част е от MS Visual C++MS Visual C++ Позволява разглеждането на Позволява разглеждането на

външните функции на даден външните функции на даден DLLDLL Пример:Пример:

DUMPBIN /EXPORTS C:\WINDOWS\system32\user32.dllDUMPBIN /EXPORTS C:\WINDOWS\system32\user32.dll……ordinal hint RVA nameordinal hint RVA name…… 446 446 1BD 0000CBBB LoadIconA1BD 0000CBBB LoadIconA 447 447 1BE 000188E3 LoadIconW1BE 000188E3 LoadIconW……

Page 14: Взаимодействие с неуправляван код

Демонстрация #1Демонстрация #1 Използване на Използване на P/InvokeP/Invoke

Page 15: Взаимодействие с неуправляван код

Преобразуване на данни Преобразуване на данни ((marshalling)marshalling) Различни платформи – различни Различни платформи – различни

типоветипове Необходимост от преобразуванеНеобходимост от преобразуване Прави се автоматично (Прави се автоматично (standard standard

interop marshaller)interop marshaller) Може да заеме допълнително паметМоже да заеме допълнително памет Може да се промени стандартното Може да се промени стандартното

действиедействие

Page 16: Взаимодействие с неуправляван код

Преобразуване – съответствияПреобразуване – съответствияНеуправляванНеуправляван

типтипУправляванУправляван

типтип

HANDLEHANDLE System.IntPtrSystem.IntPtr

BYTE BYTE System.ByteSystem.Byte

WORDWORD System.UInt16System.UInt16

DDWORDWORD System.UIntSystem.UInt3232

FLOATFLOAT System.SingleSystem.Single

LPSTRLPSTR, , LPCSTRLPCSTR,,LPWSTRLPWSTR, , LPCWSTRLPCWSTR

System.StringSystem.String или или System.StringBuilderSystem.StringBuilder

Page 17: Взаимодействие с неуправляван код

Преобразуване на структуриПреобразуване на структури Структурите се предават по стойностСтруктурите се предават по стойност Използват сеИзползват се, , когато неуправляван когато неуправляван

код използва предаване по стойност код използва предаване по стойност или чрез указателили чрез указател

Атрибутът Атрибутът StructLayoutStructLayout дефинира дефинира как да се преобразува структурата как да се преобразува структурата към неуправляван кодкъм неуправляван код LayoutKind.SequentialLayoutKind.Sequential LayoutKind.ExplicitLayoutKind.Explicit

DLLFunc(POINT x) DLLFunc(POINT x) ManagedFunc(POINT x) ManagedFunc(POINT x)DLLFunc(POINT* x) DLLFunc(POINT* x) ManagedFunc(ref POINT ManagedFunc(ref POINT x)x)

Page 18: Взаимодействие с неуправляван код

Преобразуване на структури Преобразуване на структури – пример– пример[StructLayout(LayoutKind.Explicit)][StructLayout(LayoutKind.Explicit)]public struct SYSTEM_INFOpublic struct SYSTEM_INFO{{ [FieldOffset(0)] public UInt16 ProcessorArchitecture;[FieldOffset(0)] public UInt16 ProcessorArchitecture; [FieldOffset(4)] public UInt32 PageSize;[FieldOffset(4)] public UInt32 PageSize; [FieldOffset(20)] public UInt32 NumberOfProcessors;[FieldOffset(20)] public UInt32 NumberOfProcessors; [FieldOffset(24)] public UInt32 ProcessorType;[FieldOffset(24)] public UInt32 ProcessorType; [FieldOffset(28)] public UInt32 AllocationGranularity;[FieldOffset(28)] public UInt32 AllocationGranularity; [FieldOffset(30)] public UInt16 ProcessorLevel;[FieldOffset(30)] public UInt16 ProcessorLevel;}}

[DllImport("kernel32.dll",[DllImport("kernel32.dll", EntryPoint="GetNativeSystemInfo")]EntryPoint="GetNativeSystemInfo")]public static extern void GetSysInfo(public static extern void GetSysInfo( ref SYSTEM_INFO sysinfo);ref SYSTEM_INFO sysinfo);

Page 19: Взаимодействие с неуправляван код

Преобразуване на класовеПреобразуване на класове Класовете се предават по адресКласовете се предават по адрес Използват се при единичен или Използват се при единичен или

двоен указателдвоен указател

Атрибутът Атрибутът StructLayoutStructLayout се прилага се прилага и за класовеи за класове

DLLFunc(Job* x) DLLFunc(Job* x) ManagedFunc(Job x) ManagedFunc(Job x)DLLFunc(Job** x) DLLFunc(Job** x) ManagedFunc(ref Job x) ManagedFunc(ref Job x)

Page 20: Взаимодействие с неуправляван код

Преобразуване на низовеПреобразуване на низове Символните низове в .NET са Символните низове в .NET са

постоянни (immutable)постоянни (immutable) Символните низове в неуправляван Символните низове в неуправляван

код са просто адрес в паметтакод са просто адрес в паметта Могат да имат различно кодиранеМогат да имат различно кодиране Атрибутът Атрибутът MarshalAsMarshalAs позволява позволява

правилното преобразуванеправилното преобразуване Когато символният низ е с Когато символният низ е с

неопределена дължина, се използва неопределена дължина, се използва класът класът StringBuilderStringBuilder

Page 21: Взаимодействие с неуправляван код

Атрибут Атрибут MarshalAsMarshalAs Указва начина на преобразуванеУказва начина на преобразуване Прилага се върху параметри, полета Прилага се върху параметри, полета

и резултат, когато има двусмислиеи резултат, когато има двусмислие Не е задължителенНе е задължителен При конструиране се указва При конструиране се указва

неуправляван тип, към които ще се неуправляван тип, към които ще се преобразувапреобразува

Полето Полето SizeConstSizeConst указва броя на указва броя на знаците на подавания низ по знаците на подавания низ по стойностстойност

Page 22: Взаимодействие с неуправляван код

Преобразуване – примерПреобразуване – примерНеуправляван Неуправляван

C++C++ C#C#

struct STOCKstruct STOCK{{ TCHAR ID[32];TCHAR ID[32];

char* Name;char* Name;

WCHAR* Location;WCHAR* Location;

}}

[StructLayout(LayoutKind.Sequential,[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]CharSet=CharSet.Auto)]struct STOCKstruct STOCK{{ [MarshalAs(UnmanagedType.ByValTStr,[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] SizeConst=32)] public String ID;public String ID;

[MarshalAs(UnmanagedType.LPStr)][MarshalAs(UnmanagedType.LPStr)] public String Name;public String Name; [MarshalAs(UnmanagedType.LPWStr)][MarshalAs(UnmanagedType.LPWStr)] public String Location;public String Location;}}

Page 23: Взаимодействие с неуправляван код

Преобразуване – примерПреобразуване – пример[DllImport("kernel32.dll", EntryPoint="GetModuleFileName",[DllImport("kernel32.dll", EntryPoint="GetModuleFileName", ExactSpelling=false, CharSet=CharSet.Auto)]ExactSpelling=false, CharSet=CharSet.Auto)]public static extern UInt32 GetModuleFileName(IntPtr public static extern UInt32 GetModuleFileName(IntPtr

hhMModule, StringBuilder lpFileodule, StringBuilder lpFileNName, UInt32 nSize);ame, UInt32 nSize);

[STAThread][STAThread]static void Main(string[] args)static void Main(string[] args){{ StringBuilder moduleName = new StringBuilder(10);StringBuilder moduleName = new StringBuilder(10);

UInt32 uiSize = GetModuleFileName(IntPtr.Zero,UInt32 uiSize = GetModuleFileName(IntPtr.Zero, moduleName, (uint) moduleName.Capacity + 1);moduleName, (uint) moduleName.Capacity + 1); moduleName.Length = (int) uiSize;moduleName.Length = (int) uiSize;

Console.WriteLine("Executable path: {0}",Console.WriteLine("Executable path: {0}", moduleName.ToString());moduleName.ToString());}}

Page 24: Взаимодействие с неуправляван код

Имплементиране на Имплементиране на функция функция за обратно извикванеза обратно извикване Функцията за обратно извикванеФункцията за обратно извикване ((callbackcallback) )

служи за получаване на резултат от друга служи за получаване на резултат от друга функция, която вие сте извикалифункция, която вие сте извикали

Неуправляваният код извиква функция от Неуправляваният код извиква функция от управлявания кодуправлявания код

В управлявания код се дефинира В управлявания код се дефинира променлива от тип променлива от тип delegatedelegate

BOOL EnumWindows(WNDENUMPROC lpEnumFunc,BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)LPARAM lParam)

public delegate bool CallBack(int hWnd,public delegate bool CallBack(int hWnd, int lParam);int lParam);

Page 25: Взаимодействие с неуправляван код

Демонстрация #Демонстрация #22 Преобразуване на данниПреобразуване на данни

Page 26: Взаимодействие с неуправляван код

Взаимодействие с Взаимодействие с COMCOM Какво е COM?Какво е COM?

COM = Common Object Model – компонентен COM = Common Object Model – компонентен модел, използван широко при Win32 модел, използван широко при Win32 приложенияприложения

COMCOM осигурява взаимодействие между осигурява взаимодействие между Win32 Win32 приложения посредством компонентиприложения посредством компоненти

Интерфейсът Интерфейсът IIUUnknownnknown Имплементира се задължително от всички Имплементира се задължително от всички

COMCOM компоненти компоненти AddRefAddRef, , ReleaseRelease – отброяват референциите – отброяват референциите

към компонента (към компонента (reference countingreference counting)) QueryInterfaceQueryInterface – – открива интерфейсите, открива интерфейсите,

които компонентът поддържа (като които компонентът поддържа (като reflection)reflection)

Page 27: Взаимодействие с неуправляван код

Взаимодействие с Взаимодействие с COMCOM GUIDGUID – 128-битово число, което уникално – 128-битово число, което уникално

идентифицира идентифицира COMCOM интерфейс интерфейс, , например:например: {645FF040-5081-101B-9F08-00AA002F954E}{645FF040-5081-101B-9F08-00AA002F954E}

Интерфейсът Интерфейсът IDispatchIDispatch Предоставя достъп по време на изпълнение Предоставя достъп по време на изпълнение

до свойствата и методите на компонента до свойствата и методите на компонента (като (като reflectionreflection в в .NET).NET)

In-Process In-Process и и Out-of-Process COM Out-of-Process COM сървърисървъри In-Process – DLLIn-Process – DLL библиотеки, работят в библиотеки, работят в

адресното пространство на клиентаадресното пространство на клиента Out-of-Process – Out-of-Process – отделни изпълними отделни изпълними

приложения (приложения (EXEEXE), работят в отделно ), работят в отделно адресно пространствоадресно пространство

Page 28: Взаимодействие с неуправляван код

Взаимодействие с Взаимодействие с COMCOM Модели за COM компоненти STA и MTAМодели за COM компоненти STA и MTA

Single-Threaded Apartment – всяка нишка си Single-Threaded Apartment – всяка нишка си има собствен апартамент, няма общи има собствен апартамент, няма общи данни, няма нужда от синхронизацияданни, няма нужда от синхронизация

Multithreaded Apartment – всички нишки Multithreaded Apartment – всички нишки споделят общ апартамент (общи данни), споделят общ апартамент (общи данни), синхронизацията е ръчнасинхронизацията е ръчна

Типови библиотеки (Type Libraries)Типови библиотеки (Type Libraries) Съдържат описание на COM компоненти Съдържат описание на COM компоненти

(като метаданните в асемблитата)(като метаданните в асемблитата) Представляват бинарни (Представляват бинарни (.tlb.tlb) файлове) файлове Описват типове, класове, структури и др.Описват типове, класове, структури и др.

ActiveX – ActiveX – разширение на разширение на COMCOM модела, модела, което позволява работа в мрежова средакоето позволява работа в мрежова среда

Page 29: Взаимодействие с неуправляван код

Извикване на Извикване на COM COM компонент от компонент от управляван кодуправляван код Необходимост от Interop асемблиНеобходимост от Interop асембли Генериране на Interop асембли чрез Генериране на Interop асембли чрез

Visual Studio .NETVisual Studio .NET Генериране на Interop асембли чрез Генериране на Interop асембли чрез

tlbimp.exetlbimp.exe Програмно и нестандартно Програмно и нестандартно

генериране на Interop асемблигенериране на Interop асембли Разгръщане (Разгръщане (deploymentdeployment) на Interop ) на Interop

асемблиасембли

Page 30: Взаимодействие с неуправляван код

Runtime Callable Wrapper (RCW)Runtime Callable Wrapper (RCW) COM обектите се достъпват през COM обектите се достъпват през

прокси наречено RCWпрокси наречено RCW На всеки COM обект отговаря точно На всеки COM обект отговаря точно

един RCWедин RCW Позволява стандартно Позволява стандартно

преобразуване на даннитепреобразуване на данните Достъпва стандартните COM Достъпва стандартните COM

интерфейси интерфейси IDispatchIDispatch, , IErrorInfoIErrorInfo, , IUnknownIUnknown

Page 31: Взаимодействие с неуправляван код

Извикване на COM компонент Извикване на COM компонент чрез RCWчрез RCW

RCWRCW

IDispatchIDispatch

IUnknownIUnknown

IErrorInfoIErrorInfo

ICustomerICustomerCOM обектCOM обект.NET клиент.NET клиент

IErrorInfoIErrorInfo

IWarehouseIWarehouse

IDispatchIDispatch

IUnknownIUnknown

COM обектCOM обект RCWRCW

.NET клиент.NET клиент

Page 32: Взаимодействие с неуправляван код

Демонстрация #3Демонстрация #3 Използване на Използване на COM COM компонентата компонентата

""Microsoft Web BrowserMicrosoft Web Browser"" от от VS.NETVS.NET

Page 33: Взаимодействие с неуправляван код

Разкриване на Разкриване на .NET .NET компонент компонент като като COMCOM компонент компонент Атрибутът Атрибутът GuidAttributeGuidAttribute задава задава

уникалния идентификатор на COM уникалния идентификатор на COM компонента (GUID)компонента (GUID)

Атрибутът Атрибутът ProgIdProgId задава текстов задава текстов идентификатор на COM компонентаидентификатор на COM компонента

Aсемблито се регистрира в Aсемблито се регистрира в Windows Windows Registry чрез Registry чрез regasm.exeregasm.exe или с VS.NET или с VS.NET

[GuidAttribute("D069E57A-981F-4841-8D68-E2F2342E92A2"),[GuidAttribute("D069E57A-981F-4841-8D68-E2F2342E92A2"), ProgId("SomeApplication.SomeClass")]ProgId("SomeApplication.SomeClass")]public class SomeClasspublic class SomeClass{{ // // ……}}

Page 34: Взаимодействие с неуправляван код

Разкриване на Разкриване на .NET .NET компонент компонент като като COMCOM компонент компонент Необходимост от типова библиотекаНеобходимост от типова библиотека Генериране на типовата библиотека Генериране на типовата библиотека

чрез чрез tlbexp.exetlbexp.exe Използване на атрибути за контрол Използване на атрибути за контрол

върху типовата библиотекавърху типовата библиотека CoClassAttributeCoClassAttribute ComVisibleAttribute ComVisibleAttribute GuidAttributeGuidAttribute ……

Page 35: Взаимодействие с неуправляван код

COM Callable Wrapper (CCW)COM Callable Wrapper (CCW) .NET .NET компонентите също се компонентите също се

достъпват от достъпват от COM COM клиенти през клиенти през специално проксиспециално прокси

На всеки На всеки .NET .NET компонент отговаря компонент отговаря точно един точно един CCWCCW

Стандартно преобразуване на Стандартно преобразуване на даннитеданните

Прокси класът имплементира Прокси класът имплементира стандартните стандартните COM COM интерфейси интерфейси IUnknownIUnknown, , IDispatchIDispatch, , ……

Page 36: Взаимодействие с неуправляван код

Извикване на Извикване на .NET .NET компонент чрез компонент чрез CCWCCW

CCWCCW .NET.NET обект обектCOMCOM клиент клиент

COMCOM клиент клиент

Page 37: Взаимодействие с неуправляван код

Изисквания към Изисквания към .NET .NET типове за типове за ползване от ползване от COMCOM Управляваните типове трябва да са Управляваните типове трябва да са

publicpublic Методи, свойства, полета и събития Методи, свойства, полета и събития

трябва да са трябва да са publicpublic Типовете трябва да имат публичен Типовете трябва да имат публичен

конструктор по подразбиранеконструктор по подразбиране Типовете не могат да са абстрактниТиповете не могат да са абстрактни Препоръчва се класовете да Препоръчва се класовете да

имплементират интерфейсимплементират интерфейс Избягвайте статични методиИзбягвайте статични методи

Page 38: Взаимодействие с неуправляван код

Демонстрация #4Демонстрация #4 Извикване на Извикване на .NET .NET компонент чрез компонент чрез

CCWCCW

Page 39: Взаимодействие с неуправляван код

Взаимодействие със Взаимодействие със C++ (IJW)C++ (IJW) C++C++ позволява директно извикване позволява директно извикване

на неуправляван код (на неуправляван код (It Just Works)It Just Works) Забавянето от Забавянето от IJWIJW прокси прокси

имплементацията е малко (10-30 имплементацията е малко (10-30 x86 x86 инструкции за всяко извикване) инструкции за всяко извикване)

Изрично преобразуване на даннитеИзрично преобразуване на данните Не се ползват атрибутиНе се ползват атрибути Позволява да се забележат по-лесно Позволява да се забележат по-лесно

проблеми с производителносттапроблеми с производителността Подходящ е за приложения, които Подходящ е за приложения, които

ползват предимно неуправляван кодползват предимно неуправляван код

Page 40: Взаимодействие с неуправляван код

IJW IJW извикване от извикване от C++ – C++ – примерпример#using <mscorlib.dll>#using <mscorlib.dll>

#include <stdio.h>#include <stdio.h>#include <iostream>#include <iostream>

using namespace std;using namespace std;

void main()void main(){{ // Declare unmanaged pointer of type char*// Declare unmanaged pointer of type char* const const char* str = "IJW (It Just Works)";char* str = "IJW (It Just Works)";

// Call unmanaged function "printf"// Call unmanaged function "printf" printf("%s\n", str);printf("%s\n", str);

// Call unmanaged function "ostream::operator <<"// Call unmanaged function "ostream::operator <<" cout << str << endl;cout << str << endl;

// Call managed function "Console::WriteLine"// Call managed function "Console::WriteLine" System::Console::WriteLine(str);System::Console::WriteLine(str);}}

Page 41: Взаимодействие с неуправляван код

Препоръки за използванеПрепоръки за използване на .на .NETNET типове от типове от COMCOM Използвайте “Използвайте “chunky” chunky” вместо вместо

““chatty” chatty” интерфейсиинтерфейси Имплементирайте Имплементирайте IDisposableIDisposable за за

неуправляваните ресурсинеуправляваните ресурси Избягвайте късно свързванеИзбягвайте късно свързване Указвайте името на метода който Указвайте името на метода който

искате да извикате изричноискате да извикате изрично Оптимизирайте преобразуването на Оптимизирайте преобразуването на

данниданни

Page 42: Взаимодействие с неуправляван код

Препоръки за използванеПрепоръки за използване на .на .NETNET типове от типове от COMCOM Може да използвате Може да използвате

SuppressUnmanagedCodeSuppressUnmanagedCode атрибута за атрибута за критични по скорост извикваниякритични по скорост извиквания

Следете броячите за взаимодействие Следете броячите за взаимодействие Брояч на CCWБрояч на CCW Брояч на преобразуваниятаБрояч на преобразуванията

(marshallings)(marshallings) Брояч на “корените”Брояч на “корените” (stubs) (stubs)

Използвайте CLR Spy за да откриете Използвайте CLR Spy за да откриете евентуални проблемиевентуални проблеми

Page 43: Взаимодействие с неуправляван код

Демонстрация #Демонстрация #55 Използване наИзползване на броячи и броячи и CLR SpyCLR Spy

Page 44: Взаимодействие с неуправляван код

Въпроси?Въпроси?

ВзаимодействиеВзаимодействие с с неуправляван коднеуправляван код

Page 45: Взаимодействие с неуправляван код

УпражненияУпражнения1.1. Имплементирайте Windows Forms приложение, Имплементирайте Windows Forms приложение,

което показва списък с активните в момента което показва списък с активните в момента процеси. За всеки процес трябва да се покаже процеси. За всеки процес трябва да се покаже следната информация: идентификатора му (PID), следната информация: идентификатора му (PID), името на файла, от който е зареден, приоритета му, името на файла, от който е зареден, приоритета му, обема на минималната и максималната му работна обема на минималната и максималната му работна памет (working set). Използвайте Windows API памет (working set). Използвайте Windows API функциите функциите EnumProcesses()EnumProcesses(), , OpenProcess()OpenProcess(), , GetModuleBaseName()GetModuleBaseName(), , GetPriorityClass()GetPriorityClass(), , GetProcessWorkingSetSize()GetProcessWorkingSetSize() и и CloseHandle()CloseHandle(), , като ги извиквате през P/Invoke . Дефинициите са в като ги извиквате през P/Invoke . Дефинициите са в библиотеките библиотеките kernel32.dllkernel32.dll и и psapi.dllpsapi.dll. . Използвайте документацията и примерите от MSDN Използвайте документацията и примерите от MSDN за да видите как се използват посочените функции. за да видите как се използват посочените функции. Визуализирайте по подходящ начин извлечената Визуализирайте по подходящ начин извлечената информация за процесите.информация за процесите.

Page 46: Взаимодействие с неуправляван код

УпражненияУпражнения2.2. Имплементирайте Windows Forms приложение, Имплементирайте Windows Forms приложение,

което визуализира което визуализира PDF PDF документи с помощта на документи с помощта на COM COM компонента "компонента "Adobe Acrobat Control for ActiveXAdobe Acrobat Control for ActiveX""..

3.3. Създайте Windows Forms контрола, която реализира Създайте Windows Forms контрола, която реализира играта "морски шах". Направете контролата играта "морски шах". Направете контролата достъпна като достъпна като COMCOM сървър. Направете сървър. Направете HTMLHTML страница, с която да визуализирате контролата в страница, с която да визуализирате контролата в Internet ExplorerInternet Explorer..

4.4. Реализирайте конзолно приложение, което по даден Реализирайте конзолно приложение, което по даден XMLXML файл, съдържащ списък от фирми и файл, съдържащ списък от фирми и информация за тях, генерира информация за тях, генерира MS Excel MS Excel документ, документ, съдържащ същата информациясъдържащ същата информация във вид на таблица. във вид на таблица. Всяка фирма се описва с име, адрес и телефон. За Всяка фирма се описва с име, адрес и телефон. За връзка с връзка с MS Excel MS Excel използвайте използвайте COMCOM компонентата компонентата ""Microsoft Office SpreadsheetMicrosoft Office Spreadsheet".".

Page 47: Взаимодействие с неуправляван код

Използвана литератураИзползвана литература MSDN Library – MSDN Library – http://msdn.microsoft.comhttp://msdn.microsoft.com

Interoperating with Unmanaged CodeInteroperating with Unmanaged Code An Overview of Managed/Unmanaged Code An Overview of Managed/Unmanaged Code

InteroperabilityInteroperability Beyond (COM) Add Reference: Has Anyone Seen Beyond (COM) Add Reference: Has Anyone Seen

the Bridge?the Bridge? Using the .NET Framework SDK Interoperability Using the .NET Framework SDK Interoperability

ToolsTools Calling a .NET Component from a COM Calling a .NET Component from a COM

Component Component Microsoft Office and .NET InteroperabilityMicrosoft Office and .NET Interoperability The Myth of .NET Purity, ReloadedThe Myth of .NET Purity, Reloaded Platform Invocation ServicesPlatform Invocation Services

Page 48: Взаимодействие с неуправляван код

Използвана литератураИзползвана литература MSDN Magazine – MSDN Magazine –

http://msdn.microsoft.com/msdnmag/http://msdn.microsoft.com/msdnmag/ Calling Win32 DLLs in C# with P/InvokeCalling Win32 DLLs in C# with P/Invoke Migrating Native Code to the .NET CLR Migrating Native Code to the .NET CLR

Improving .NET Application Performance and Improving .NET Application Performance and Scalability – MS Patterns and Practices – Scalability – MS Patterns and Practices – http://msdn.microsoft.com/library/en-us/dnpahttp://msdn.microsoft.com/library/en-us/dnpag/html/scalenet.aspg/html/scalenet.asp Chapter 7 – Improving Interop PerformanceChapter 7 – Improving Interop Performance Checklist: Interop PerformanceChecklist: Interop Performance

P/Invoke .NET: The Interop wiki! – P/Invoke .NET: The Interop wiki! – http://http://www.pinvoke.netwww.pinvoke.net//

Page 49: Взаимодействие с неуправляван код

Използвана литератураИзползвана литература Microsoft .NET/COM Migration and Interoperability – Microsoft .NET/COM Migration and Interoperability –

http://msdn.microsoft.com/library/default.asp?url=http://msdn.microsoft.com/library/default.asp?url= /library/en-us/dnbda/html/cominterop.asp/library/en-us/dnbda/html/cominterop.asp

CLR Spy – CLR Spy – http://www.gotdotnet.com/Community/http://www.gotdotnet.com/Community/ UserSamples/Details.aspx?SampleGuid=C7B955C7-2UserSamples/Details.aspx?SampleGuid=C7B955C7-231A-406C-9FA5-AD09EF3BB37F31A-406C-9FA5-AD09EF3BB37F