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
ВзаимодействиеВзаимодействие с с неуправляван коднеуправляван код
Програмиране заПрограмиране за .NET Framework .NET Frameworkhttp://http://www.nakov.comwww.nakov.com//dotnet-projectdotnet-project//
Мартин КуловМартин КуловИзпълнителен директорИзпълнителен директорCodeAttestCodeAttestwww.codeattest.comwww.codeattest.com
Необходими знанияНеобходими знания Базови познания за общата система от Базови познания за общата система от
типове в типове в .NET (Common Type System).NET (Common Type System) Базови познания за езика Базови познания за езика C#C# Базови познания за езика Базови познания за езика C++C++ Базови познания за технологията Базови познания за технологията COMCOM Базови познания за програмиране под Базови познания за програмиране под
Win32 със C и C++Win32 със C и C++ Познания за атрибутите в .NETПознания за атрибутите в .NET Framework Framework
СъдържаниеСъдържание Какво е взаимодействие?Какво е взаимодействие? Платформено извикване (P/Invoke)Платформено извикване (P/Invoke)
Атрибут Атрибут DllImportDllImport Преобразуване на данни (marshalling)Преобразуване на данни (marshalling) Преобразуване на структуриПреобразуване на структури Преобразуване на класовеПреобразуване на класове Преобразуване на низовеПреобразуване на низове Атрибут Атрибут MarshalAsMarshalAs Имплементиране на функция за обратно Имплементиране на функция за обратно
извикванеизвикване
СъдържаниеСъдържание (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
Какво е взаимодействие?Какво е взаимодействие? MicrosoftMicrosoft .NET Framework .NET Framework е е
сравнително нова технологиясравнително нова технология Съществува огромно количество Съществува огромно количество
готов неуправляван кодготов неуправляван код Предимствата на управлявания кодПредимствата на управлявания код
Безопасност на типоветеБезопасност на типовете Защита на паметтаЗащита на паметта Отражение на типоветеОтражение на типовете
Обща среда или виртуална машинаОбща среда или виртуална машина CLR CLR срещу срещу JVMJVM
.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
Архитектурата на Архитектурата на JVMJVM
Java PlatformJava Platform
Java VirtualJava Virtual Machine (JVM)Machine (JVM)
Java Java приложениеприложение
Windows APIWindows APICOMCOMWindows KernelWindows Kernel
JavaJavaClass LibrariesClass Libraries
JNIJNI
Платформено извикване Платформено извикване (P/Invoke)(P/Invoke) Подходящ за сравнително прости Подходящ за сравнително прости
Windows Windows функции (функции (simple flat API)simple flat API) Подходящ за малък брой методи от Подходящ за малък брой методи от
неуправляван коднеуправляван код Атрибутът Атрибутът DllImportDllImport служи за служи за
извикване на неуправляван кодизвикване на неуправляван код За удобство За удобство DLL DLL функциите могат да функциите могат да
се организират в классе организират в клас
Атрибут Атрибут DllImportDllImport Използва се за дефиниране на връзка с Използва се за дефиниране на връзка с
неуправляван коднеуправляван код Прилага се върху методиПрилага се върху методи При конструиране се указва името на При конструиране се указва името на
DLL, който съдържа методаDLL, който съдържа метода Полето Полето EntryPointEntryPoint указва името на указва името на
извиквания методизвиквания метод Полето Полето CharSetCharSet определя как да се определя как да се
кодират символните низовекодират символните низове Полето Полето SetLastErrorSetLastError дава възможност дава възможност
за извличане на грешказа извличане на грешка
Как работи Как работи P/InvokeP/Invoke?? Намира и зарежда в паметта указания Намира и зарежда в паметта указания
DLLDLL (изпълнява се само веднъж) (изпълнява се само веднъж) Зарежда адреса на функцията, Зарежда адреса на функцията,
подава аргументите й и преобразува подава аргументите й и преобразува даннитеданните
Подава контрола на неуправлявания Подава контрола на неуправлявания кодкод
P/InvokeP/Invoke може да хвърли изключение може да хвърли изключение от неуправлявания кодот неуправлявания код
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();}}
Командата Командата 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……
Демонстрация #1Демонстрация #1 Използване на Използване на P/InvokeP/Invoke
Преобразуване на данни Преобразуване на данни ((marshalling)marshalling) Различни платформи – различни Различни платформи – различни
типоветипове Необходимост от преобразуванеНеобходимост от преобразуване Прави се автоматично (Прави се автоматично (standard standard
interop marshaller)interop marshaller) Може да заеме допълнително паметМоже да заеме допълнително памет Може да се промени стандартното Може да се промени стандартното
действиедействие
Преобразуване – съответствияПреобразуване – съответствияНеуправляванНеуправляван
типтипУправляванУправляван
типтип
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
Преобразуване на структуриПреобразуване на структури Структурите се предават по стойностСтруктурите се предават по стойност Използват сеИзползват се, , когато неуправляван когато неуправляван
код използва предаване по стойност код използва предаване по стойност или чрез указателили чрез указател
Атрибутът Атрибутът 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)
Преобразуване на структури Преобразуване на структури – пример– пример[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);
Преобразуване на класовеПреобразуване на класове Класовете се предават по адресКласовете се предават по адрес Използват се при единичен или Използват се при единичен или
двоен указателдвоен указател
Атрибутът Атрибутът 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)
Преобразуване на низовеПреобразуване на низове Символните низове в .NET са Символните низове в .NET са
постоянни (immutable)постоянни (immutable) Символните низове в неуправляван Символните низове в неуправляван
код са просто адрес в паметтакод са просто адрес в паметта Могат да имат различно кодиранеМогат да имат различно кодиране Атрибутът Атрибутът MarshalAsMarshalAs позволява позволява
правилното преобразуванеправилното преобразуване Когато символният низ е с Когато символният низ е с
неопределена дължина, се използва неопределена дължина, се използва класът класът StringBuilderStringBuilder
Атрибут Атрибут MarshalAsMarshalAs Указва начина на преобразуванеУказва начина на преобразуване Прилага се върху параметри, полета Прилага се върху параметри, полета
и резултат, когато има двусмислиеи резултат, когато има двусмислие Не е задължителенНе е задължителен При конструиране се указва При конструиране се указва
неуправляван тип, към които ще се неуправляван тип, към които ще се преобразувапреобразува
Полето Полето SizeConstSizeConst указва броя на указва броя на знаците на подавания низ по знаците на подавания низ по стойностстойност
Преобразуване – примерПреобразуване – примерНеуправляван Неуправляван
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;}}
Преобразуване – примерПреобразуване – пример[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());}}
Имплементиране на Имплементиране на функция функция за обратно извикванеза обратно извикване Функцията за обратно извикванеФункцията за обратно извикване ((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);
Демонстрация #Демонстрация #22 Преобразуване на данниПреобразуване на данни
Взаимодействие с Взаимодействие с 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)
Взаимодействие с Взаимодействие с 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), работят в отделно ), работят в отделно адресно пространствоадресно пространство
Взаимодействие с Взаимодействие с 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 модела, модела, което позволява работа в мрежова средакоето позволява работа в мрежова среда
Извикване на Извикване на COM COM компонент от компонент от управляван кодуправляван код Необходимост от Interop асемблиНеобходимост от Interop асембли Генериране на Interop асембли чрез Генериране на Interop асембли чрез
Visual Studio .NETVisual Studio .NET Генериране на Interop асембли чрез Генериране на Interop асембли чрез
tlbimp.exetlbimp.exe Програмно и нестандартно Програмно и нестандартно
генериране на Interop асемблигенериране на Interop асембли Разгръщане (Разгръщане (deploymentdeployment) на Interop ) на Interop
асемблиасембли
Runtime Callable Wrapper (RCW)Runtime Callable Wrapper (RCW) COM обектите се достъпват през COM обектите се достъпват през
прокси наречено RCWпрокси наречено RCW На всеки COM обект отговаря точно На всеки COM обект отговаря точно
един RCWедин RCW Позволява стандартно Позволява стандартно
преобразуване на даннитепреобразуване на данните Достъпва стандартните COM Достъпва стандартните COM
интерфейси интерфейси IDispatchIDispatch, , IErrorInfoIErrorInfo, , IUnknownIUnknown
Извикване на COM компонент Извикване на COM компонент чрез RCWчрез RCW
RCWRCW
IDispatchIDispatch
IUnknownIUnknown
IErrorInfoIErrorInfo
ICustomerICustomerCOM обектCOM обект.NET клиент.NET клиент
IErrorInfoIErrorInfo
IWarehouseIWarehouse
IDispatchIDispatch
IUnknownIUnknown
COM обектCOM обект RCWRCW
.NET клиент.NET клиент
Демонстрация #3Демонстрация #3 Използване на Използване на COM COM компонентата компонентата
""Microsoft Web BrowserMicrosoft Web Browser"" от от VS.NETVS.NET
Разкриване на Разкриване на .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{{ // // ……}}
Разкриване на Разкриване на .NET .NET компонент компонент като като COMCOM компонент компонент Необходимост от типова библиотекаНеобходимост от типова библиотека Генериране на типовата библиотека Генериране на типовата библиотека
чрез чрез tlbexp.exetlbexp.exe Използване на атрибути за контрол Използване на атрибути за контрол
върху типовата библиотекавърху типовата библиотека CoClassAttributeCoClassAttribute ComVisibleAttribute ComVisibleAttribute GuidAttributeGuidAttribute ……
COM Callable Wrapper (CCW)COM Callable Wrapper (CCW) .NET .NET компонентите също се компонентите също се
достъпват от достъпват от COM COM клиенти през клиенти през специално проксиспециално прокси
На всеки На всеки .NET .NET компонент отговаря компонент отговаря точно един точно един CCWCCW
Стандартно преобразуване на Стандартно преобразуване на даннитеданните
Прокси класът имплементира Прокси класът имплементира стандартните стандартните COM COM интерфейси интерфейси IUnknownIUnknown, , IDispatchIDispatch, , ……
Извикване на Извикване на .NET .NET компонент чрез компонент чрез CCWCCW
CCWCCW .NET.NET обект обектCOMCOM клиент клиент
COMCOM клиент клиент
Изисквания към Изисквания към .NET .NET типове за типове за ползване от ползване от COMCOM Управляваните типове трябва да са Управляваните типове трябва да са
publicpublic Методи, свойства, полета и събития Методи, свойства, полета и събития
трябва да са трябва да са publicpublic Типовете трябва да имат публичен Типовете трябва да имат публичен
конструктор по подразбиранеконструктор по подразбиране Типовете не могат да са абстрактниТиповете не могат да са абстрактни Препоръчва се класовете да Препоръчва се класовете да
имплементират интерфейсимплементират интерфейс Избягвайте статични методиИзбягвайте статични методи
Демонстрация #4Демонстрация #4 Извикване на Извикване на .NET .NET компонент чрез компонент чрез
CCWCCW
Взаимодействие със Взаимодействие със C++ (IJW)C++ (IJW) C++C++ позволява директно извикване позволява директно извикване
на неуправляван код (на неуправляван код (It Just Works)It Just Works) Забавянето от Забавянето от IJWIJW прокси прокси
имплементацията е малко (10-30 имплементацията е малко (10-30 x86 x86 инструкции за всяко извикване) инструкции за всяко извикване)
Изрично преобразуване на даннитеИзрично преобразуване на данните Не се ползват атрибутиНе се ползват атрибути Позволява да се забележат по-лесно Позволява да се забележат по-лесно
проблеми с производителносттапроблеми с производителността Подходящ е за приложения, които Подходящ е за приложения, които
ползват предимно неуправляван кодползват предимно неуправляван код
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);}}
Препоръки за използванеПрепоръки за използване на .на .NETNET типове от типове от COMCOM Използвайте “Използвайте “chunky” chunky” вместо вместо
““chatty” chatty” интерфейсиинтерфейси Имплементирайте Имплементирайте IDisposableIDisposable за за
неуправляваните ресурсинеуправляваните ресурси Избягвайте късно свързванеИзбягвайте късно свързване Указвайте името на метода който Указвайте името на метода който
искате да извикате изричноискате да извикате изрично Оптимизирайте преобразуването на Оптимизирайте преобразуването на
данниданни
Препоръки за използванеПрепоръки за използване на .на .NETNET типове от типове от COMCOM Може да използвате Може да използвате
SuppressUnmanagedCodeSuppressUnmanagedCode атрибута за атрибута за критични по скорост извикваниякритични по скорост извиквания
Следете броячите за взаимодействие Следете броячите за взаимодействие Брояч на CCWБрояч на CCW Брояч на преобразуваниятаБрояч на преобразуванията
(marshallings)(marshallings) Брояч на “корените”Брояч на “корените” (stubs) (stubs)
Използвайте CLR Spy за да откриете Използвайте CLR Spy за да откриете евентуални проблемиевентуални проблеми
Демонстрация #Демонстрация #55 Използване наИзползване на броячи и броячи и CLR SpyCLR Spy
Въпроси?Въпроси?
ВзаимодействиеВзаимодействие с с неуправляван коднеуправляван код
УпражненияУпражнения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 за да видите как се използват посочените функции. за да видите как се използват посочените функции. Визуализирайте по подходящ начин извлечената Визуализирайте по подходящ начин извлечената информация за процесите.информация за процесите.
УпражненияУпражнения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".".
Използвана литератураИзползвана литература 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
Използвана литератураИзползвана литература 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//
Използвана литератураИзползвана литература 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