NET Framework NET NET Framework Class Libraries Common
Среда за контролирано изпълнение. NET Framework. NET приложение. NET Framework Class Libraries Common Language Runtime (CLR) COM Platform Interop Windows API Windows Kernel
Архитектурата на JVM Java Platform Java приложение Java Class Libraries Java Virtual Machine (JVM) COM JNI Windows API Windows Kernel
P/Invoke – пример static Int. Ptr IDI_ASTERISK = (Int. Ptr) 32516; [Dll. Import("user 32. dll", Entry. Point="Load. Icon. W", Exact. Spelling=true, Char. Set=Char. Set. Unicode)] public static extern Int. Ptr Load. Predefined. Icon( Int. Ptr hinst, Int. Ptr icon); private void Form 1_Load(object sender, System. Event. Args e) { // извличаме манипулатора на системната икона Int. Ptr hicon = Load. Predefined. Icon(Int. Ptr. Zero, IDI_ASTERISK); // създаваме нов обект икона от получения манипулатор Icon icon = Icon. From. Handle(hicon); // променяме иконата на главния прозорец this. Icon = (Icon) icon. Clone(); }
Командата DUMPBIN u u Стартира се от командния ред Част е от MS Visual C++ Позволява разглеждането на външните функции на даден DLL Пример: DUMPBIN … ordinal … 446 447 … /EXPORTS C: WINDOWSsystem 32user 32. dll hint RVA name 1 BD 0000 CBBB Load. Icon. A 1 BE 000188 E 3 Load. Icon. W
Преобразуване – съответствия Неуправляван тип Управляван тип HANDLE System. Int. Ptr BYTE System. Byte WORD System. UInt 16 DWORD System. UInt 32 FLOAT System. Single LPSTR, LPCSTR, LPWSTR, LPCWSTR System. String или System. String. Builder
Преобразуване на структури – пример [Struct. Layout(Layout. Kind. Explicit)] public struct SYSTEM_INFO { [Field. Offset(0)] public UInt 16 Processor. Architecture; [Field. Offset(4)] public UInt 32 Page. Size; [Field. Offset(20)] public UInt 32 Number. Of. Processors; [Field. Offset(24)] public UInt 32 Processor. Type; [Field. Offset(28)] public UInt 32 Allocation. Granularity; [Field. Offset(30)] public UInt 16 Processor. Level; } [Dll. Import("kernel 32. dll", Entry. Point="Get. Native. System. Info")] public static extern void Get. Sys. Info( ref SYSTEM_INFO sysinfo);
Преобразуване – пример Неуправляван C++ struct STOCK { TCHAR ID[32]; char* C# [Struct. Layout(Layout. Kind. Sequential, Char. Set=Char. Set. Auto)] struct STOCK { [Marshal. As(Unmanaged. Type. By. Val. TStr, Size. Const=32)] public String ID; Name; [Marshal. As(Unmanaged. Type. LPStr)] public String Name; WCHAR* Location; } [Marshal. As(Unmanaged. Type. LPWStr)] public String Location; }
Преобразуване – пример [Dll. Import("kernel 32. dll", Entry. Point="Get. Module. File. Name", Exact. Spelling=false, Char. Set=Char. Set. Auto)] public static extern UInt 32 Get. Module. File. Name(Int. Ptr h. Module, String. Builder lp. File. Name, UInt 32 n. Size); [STAThread] static void Main(string[] args) { String. Builder module. Name = new String. Builder(10); UInt 32 ui. Size = Get. Module. File. Name(Int. Ptr. Zero, module. Name, (uint) module. Name. Capacity + 1); module. Name. Length = (int) ui. Size; Console. Write. Line("Executable path: {0}", module. Name. To. String()); }
Извикване на COM компонент чрез RCW IUnknown IDispatch COM обект IError. Info ICustomer RCW IUnknown . NET клиент IDispatch COM обект IError. Info IWarehouse . NET клиент RCW
IJW извикване от C++ – пример #using <mscorlib. dll> #include <stdio. h> #include <iostream> using namespace std; void main() { // Declare unmanaged pointer of type char* const char* str = "IJW (It Just Works)"; // Call unmanaged function "printf" printf("%sn", str); // Call unmanaged function "ostream: : operator <<" cout << str << endl; // Call managed function "Console: : Write. Line" } System: : Console: : Write. Line(str);
Използвана литература u MSDN Library – http: //msdn. microsoft. com v v v v Interoperating with Unmanaged Code An Overview of Managed/Unmanaged Code Interoperability Beyond (COM) Add Reference: Has Anyone Seen the Bridge? Using the. NET Framework SDK Interoperability Tools Calling a. NET Component from a COM Component Microsoft Office and. NET Interoperability The Myth of. NET Purity, Reloaded Platform Invocation Services
Използвана литература u MSDN Magazine – http: //msdn. microsoft. com/msdnmag/ v v u Improving. NET Application Performance and Scalability – MS Patterns and Practices – http: //msdn. microsoft. com/library/enus/dnpag/html/scalenet. asp v v u Calling Win 32 DLLs in C# with P/Invoke Migrating Native Code to the. NET CLR Chapter 7 – Improving Interop Performance Checklist: Interop Performance P/Invoke. NET: The Interop wiki! – http: //www. pinvoke. net/
Използвана литература u u Microsoft. NET/COM Migration and Interoperability – http: //msdn. microsoft. com/library/default. asp? url= /library/en-us/dnbda/html/cominterop. asp CLR Spy – http: //www. gotdotnet. com/Community/ User. Samples/Details. aspx? Sample. Guid=C 7 B 955 C 7231 A-406 C-9 FA 5 -AD 09 EF 3 BB 37 F
- Slides: 49