A CROSS-PLATFORM.NET CUSTOM CONTROL ARCHITECTURE FOR HUMAN MACHINE INTERFACE RUNTIME APPLICATION
|
|
|
- Esther Ball
- 9 years ago
- Views:
Transcription
1 A CROSS-PLATFORM.NET CUSTOM CONTROL ARCHITECTURE FOR HUMAN MACHINE INTERFACE RUNTIME APPLICATION Yandong Zhong Master Thesis System on Chip Design Royal Institute of Technology Supervisor: Lingyun Wang Examiner: Prof. Axel Jantsch TRITA-ICT-EX-2012:61
2
3 III Abstract The Human Machine Interface (HMI) is where interaction between humans and machines occurs. It is widely used in industry such as automatic control field. Controls such as button, text box and so on are fundamental and commonly used in the HMI. Controls typically contain the User Interface (UI) rendering and the business logic. The UI is the graphic display for users, and business logic is logic unit used to handle events of controls in UI. A typical HMI platform usually provides standard controls for users, but users may also want to use.net custom controls such as self-defined controls and thirdparty controls. The feature of supporting.net custom controls is what the thesis is concern on. Siemens is developing a new HMI platform in which the HMI runtime software has no prior knowledge of a.net custom control until it is loaded during runtime. However, the business logic of the.net custom controls will ideally reside in the HMI runtime software, where the full runtime functionalities are available. The key of this concept is to separate the UI rendering of a control and the business logic of a control. Hosting business logic in the runtime will allow sharing the stable and UI-independent business logic across multiple platforms. In this thesis, a research of existing solutions for the cross-platform custom control concept is carried out, and the concept of.net custom controls, possible architecture of the cross-process communication model for the thesis topic are defined. The solution of a cross-platform.net custom control architecture for Siemens HMI runtime software is proposed and the prototype of the solution is implemented under both the Microsoft Windows 32-bit (Win32) and the Microsoft Windows Embedded CE 6.0 (WinCE 6.0) operating system environment. The prototype fulfills the functionality well under both the Win32 and the WinCE 6.0 environment. Furthermore, the prototype efficiency is measured by testing time overhead for method calling crossing process boundaries in the prototype. At last, a conclusion is made and future work is discussed.
4 IV Acknowledgements First of all, I would like to thank my supervisor, Mr. Lingyun Wang, for his unlimited support and encouragement in both my research and personal development. I also would like to acknowledge Prof. Axel Jantsch for providing me the strongest support in thesis writing as my thesis examiner. This work was supported by Siemens Corporate Research. I am greatly grateful to the Siemens people who I gained the experience and help from, and especially to Mr. Rajesh Gururaj for his help during my Siemens internship. I also would like to thank all my friends in Sweden, who I have a precious 2 years experience with. Finally, I greatly appreciate my parents and my brother for everything they have done for me.
5 V Contents Chapter 1 Introduction Motivation Problem Definition Thesis Overview... 2 Chapter 2 Background Human Machine Interface Custom Control Definition Microsoft Windows Embedded CE Microsoft.NET Compact Framework Component Object Model Managed/Unmanaged Code Interoperability... 8 Chapter 3 Architecture Design Design Requirement Components Definition Communication Mechanism Introduction Comparison of Interoperability between Managed and Unmanaged Code in.net Framework 3.5 and.net CF Communication Mechanism Used in the Architecture Possible Architecture Solutions Introduction Solution One Solution Two Solution Three Conclusion Cross-platform.NET Custom Control Architecture Chapter 4 Architecture Implementation Introduction... 29
6 VI 4.2 Components Out of Process COM Server Component NET Client Component Native Runtime Client Component Communication Mechanism Communication between.net Client Component and Out of Process COM Server Component Reason for Using In-process COM Server DLL Communication between Native Runtime Client Component and Out of Process COM Server Component Interfaces Chapter 5 Verification of Architecture Prototype Introduction Functionalities Verification Scenario One Scenario Two Scenario Three Scenario Four Prototype Efficiency Overhead Definition Overhead Measurement Tool Measuring Overhead Chapter 6 Conclusion and Future Work Conclusion Future Work References... 62
7 VII List of Tables Table 3.1 Table 3.2 Table 5.1 Table 5.2 Table 5.3 Table 5.4 Comparison of interoperability between managed and unmanaged code under.net Compact Framework 3.5 and Full.NET Framework 3.5 Comparison of interoperability between managed and unmanaged code under.net Compact Framework 3.5 and Full.NET Framework 3.5 Time overhead for displaying a small size document Constitution of total overhead time for displaying a small size document Time overhead for displaying a large size document Constitution of total overhead time for displaying a large size document
8 VIII List of Figures Figure 3.1 Schema of Platform Invoke in the.net CF 3.5. Figure 3.2 Schema of Platform Invoke in the.net Framework 3.5 Figure 3.3 Schema of MessageWindow Class in the.net CF 3.5 Figure 3.4 Schema of COM Interoperability in the.net CF 3.5 Figure 3.5 Schema of directly accessing a managed API in the.net Framework 3.5 Figure 3.6 Schema of exposing a managed API as a COM API in the.net Framework 3.5 Figure 3.7 Architecture of solution one Figure 3.8 Architecture of solution two Figure 3.9 Architecture of solution three Figure 3.10 The cross-platform.net custom control architecture for the Siemens HMI runtime application Figure 4.1 The cross-platform.net custom control architecture Figure 4.2 A simple COM server structure Figure 4.3 Calling into a SimpleCOMServer object from the.net client component Figure 4.4 Communication between the.net client component and the out of process COM server component Figure 4.5 A Simple COM server structure Figure 4.6 Communication between the native runtime component and the out of process COM server component Figure 4.7 Communication between the native runtime client component and the.net client component using the out of COM server component Figure 5.1 Method calling path in the test scenario Figure 6.1 The cross-platform.net custom control architecture for a Siemens HIM runtime application
9 IX List of Abbreviations API CCW CLR COM DLL GUID HMI MIDL OLE RCW RPC SCADA STA UI Win32 WinCE.NET CF Application Programming Interface COM Callable Wrapper Common Language Runtime Component Object Model Dynamic Link Library Globally Unique Identifier Human Machine Interface Microsoft Interface Definition Language Object Linking and Embedding Runtime Callable Wrapper Remote Procedure Call Supervisory Control And Data Acquisition Single-Threaded Apartment User Interface Microsoft Windows 32-bit Microsoft Windows Embedded CE.NET Compact Framework
10 1 Chapter 1 Introduction 1.1 Motivation SIEMENS is developing a new HMI innovation platform. The goal of the new HMI runtime platform is to harmonize the existing, heterogeneous HMI products ranging from small HMI Panels to sophisticated Supervisory Control And Data Acquisition (SCADA) systems. All these products are going to be built upon the new HMI runtime platform and extended by product-specific functionalities if required. Controls are fundamental and common in the HMI and typically contain the UI rendering and the business logic. The UI is the graphic display for users, and business logic is logic unit used to handle events of controls in the UI. A typical HMI platform usually provides standard controls for users, but users may also want to use.net custom controls such as self-defined controls and third-party controls. Therefore, the new HMI platform has the design requirement of supporting.net custom controls. So, the new platform aims to not only provide plenty of standard controls but also support loading.net custom controls such as self-defined controls and third-party controls during runtime in the new platform. Since.NET custom controls are loaded during runtime, the HMI runtime application in the platform has no prior knowledge of a.net custom control until it is loaded during runtime. However, the business logic of the.net custom control will ideally reside in the HMI runtime application, where the full runtime functionalities are available. The key of this concept is to separate the UI rendering of a control and the business logic of a control. Hosting business logic in the runtime will allow sharing the stable and UIindependent business logic across multiple platforms. The final solution of a cross-platform.net custom controls architecture should support the tight integration (e.g. communication) between the UI rendering and the business
11 2 logic, and be generic so that it can be applied to multiple Siemens HMI platforms without much of an effort. 1.2 Problem Definition The goal of this thesis is to develop a cross-platform.net custom control architecture for a Siemens HMI runtime application and a prototype to validate the architecture on an embedded Panel device with the WinCE 6.0 operating system environment and a standard Windows PC with the Win32 operating system environment. The prototype shall be designed generically so that it can be deployed and run on multiple Siemens HMI platforms without much of an effort. 1.3 Thesis Overview This thesis was primarily focused on defining a concept of.net custom controls, the business logic in the HMI runtime unit and the control logic in the container holding controls, as well as an architecture of the communication model between the business logic and the UI. Then the solution for the cross-platform.net custom control architecture was determined and the prototype was implemented to verify the solution. In addition, the functionality of the prototype was tested and the prototype efficiency was calculated by measuring time overhead of method calling across components in the architecture. This thesis is organized as follows. Chapter 1 provides a brief introduction of the motivation, problem description and the structure of this thesis. Chapter 2 discusses background information about the HMI,.NET custom controls, the WinCE, the.net compact framework, the Component Object Model (COM), the interoperability between managed and unmanaged code and so on, which are the
12 3 fundamental knowledge used in the.net custom control architecture design. Literature research of this thesis topic is carried out as thesis references. Chapter 3 presents the.net custom control architecture design from components definition, communication model between the business logic and the UI to the whole architecture design. Several possible architecture solutions are proposed and evaluated to find out the final solution. Chapter 4 implements the prototype of the.net custom control architecture solution. Components and communication mechanism in the solution are illustrated. The prototype can work successfully both on the Win32 and the WinCE operating system environment, which demonstrates the architecture solution. Chapter 5 describes prototype test and verification process. Functionalities of the prototype are verified through several verification scenarios. Besides, the prototype efficiency is measured and analyzed by measuring time overhead of method calling across process boundaries in the prototype. Chapter 6 summarizes the work of this thesis project and discusses further work of this topic.
13 4
14 5 Chapter 2 Background 2.1 Human Machine Interface The HMI [1] is the space where interaction between humans and machines occurs and it is usually used in the industry field. Good HMI can make the operator control the machine more effectively and obtain feedback from the machine which helps the operator with making operational decisions [2]. The HMI is widely used in many industry fields including power system, machinery operator controls, automatic controls, electronics device and so on. Especially as the touch screen development is more and more mature, the HMI in electronics device is much more powerful than before. The HMI includes hardware and software components. Hardware components are the physical part of the HMI which accept input generated by users manipulation and display corresponding output indicating the effects of users manipulation. Software components are the logical part of the HMI which are used to operate proper logic functions by handling input and producing output. In general, the goal of the HMI is to produce a user interface which is easy and efficient for users to operate a machine in the way which produces the desired result. 2.2 Custom Control Definition To define the concept of custom controls [3], it is important to clarify the different types of custom controls. In the thesis, custom controls are classified to the following 3 types: 1. The faceplate, which is a composition of controls. Every control in a faceplate is an instance of the control itself. Users may add new properties to the faceplate control.
15 6 2. The inherited control, which is a control inherited from an existing control with some custom changes in the properties and No change in the UI. In this case, users can add new properties to the new existing-inherited control, and inherit all default properties, events/action handlings from the existing control. Some custom changes in the UI. In this case, users can override the default image of the control. Users can provide their own drawing for the control. However, the UI event handlings are still from the existing control. 3. The custom-drawn control, which is a totally new control where the UI and the business logic are created from scratch. Three types of.net custom controls are typically not isolated but used together. The following is one example how a user can create a new control. First, an inherited control custom-button with a 3-D custom UI can be created from the existing button control. Secondly, another inherited control custom-io-field can be created from an existing IO field control and a few new properties can be added. Lastly, some existing static text field control, the newly created custom-button and custom-io-field are grouped together in a faceplate my control. 2.3 Microsoft Windows Embedded CE The Microsoft Windows Embedded CE [4] is a real-time operating system developed by Microsoft for embedded systems used in a wide range of consumer and enterprise devices with small memory footprint. The latest version 7 is named as Windows Embedded Compact and previous versions are known as Windows Embedded CE, and they are usually abbreviated as WinCE. The WinCE is a distinct operating system and kernel from desk Windows operating system, which means that the WinCE cannot be seen as a trimmed-down version of the desktop Windows operating system. The WinCE is targeted to devices that have limited hardware resources, such as hand-held devices which may have minimal storage. The WinCE 6.0 is used in this thesis. It is the sixth
16 7 major release of Windows Embedded Operating System targeted to enterprise specific tools such as industrial controllers and consumer electronics devices like digital cameras. 2.4 Microsoft.NET Compact Framework The Microsoft.NET Framework [5] needs to be introduced before discussing the Microsoft.NET Compact Framework. The.NET Framework is a software framework that runs primarily on Microsoft Windows platform. It includes a large framework class and an execution environment known as the Common Language Runtime (CLR). The framework class library provides a number of functionalities to all languages using the.net Framework. CLR is the core concept of the.net Framework which provides a language-independent platform for application development and execution. By implementing this important feature, the.net Framework provides language interoperability across several programming languages. The Microsoft.NET Compact Framework (.NET CF) [6] is a limited version of the.net Framework that is designed to run on resource limited embedded devices such as mobile phones, factory controllers, etc. Some class libraries in the.net CF are the same as in the full.net Framework, however, there are also a few exclusive libraries in the.net CF such as the.net CF controls for mobile devices. The.NET CF is a subset of the.net Framework and it is scaled down to use less memory space. Therefore, the.net CF only supports about 30 percent of the namespaces and classes of the.net Framework, and is about 8 percent of its size. To keep the size small, only the most important classes and members are supported. The.NET CF 3.5 is used in this thesis.
17 8 2.5 Component Object Model The Component Object Model (COM) [7] is software architecture developed by Microsoft that allows applications to be built from binary software components. COM objects are discrete components, and each COM object has a unique identity number. COM objects expose interfaces that applications and other components can use to access features defined in the COM object. COM objects are more powerful than Dynamic Link Library (DLL) since they are platform-independent, have built-in inter-process communications capability, and can be easily embedded in object-oriented system. In the thesis, a single universal COM object is created to provide interfaces for communication between the HMI runtime application and the UI of.net custom controls. 2.6 Managed/Unmanaged Code Interoperability The CLR in.net Framework provides the interoperability [8] of managed code such as C# and other types of unmanaged code such as C++. There are lots of differences on data types, memory management, exception handling mechanisms, security, and design rules between managed and unmanaged object models, but the CLR conceals the differences between them and takes care of the interoperability work. The interoperability is bidirectional, which makes it possible to call into unmanaged code from managed code and expose managed code to unmanaged code. There are mainly three technologies to achieve the interoperability between managed and unmanaged code. 1. Platform Invoke enables calling from managed code into unmanaged code. Managed code can call a function in unmanaged code if its signature is declared in managed code. 2. COM interoperability enables calling methods in COM components in a manner similar to using normal managed components, and vice versa. So it is allowed to call into native COM object functions from managed code, as well as to call managed functions exposed through COM interfaces from native COM object.
18 9 3. C++ interoperability is a C++ specific feature, which enables flat Application Programming Interfaces (APIs) and COM APIs to be used directly, as they have always been used. This is more powerful than COM interoperability, but it also requires much more care.
19 10
20 11 Chapter 3 Architecture Design 3.1 Design Requirement The goal of this thesis is to develop a cross-platform.net custom control architecture for a Siemens HMI runtime application. It is required that the HMI can load not only standard controls provided by Win32 or WinCE operating system, but also.net custom controls like user-design controls or third-party controls. Because.NET custom controls are loaded when the HMI runtime application is running, the HMI runtime application has no prior knowledge of.net custom controls until they are loaded, which means solutions like predefining business logic of specific controls won t meet the architecture design requirements. Therefore, it is required that a generic business logic of controls must be designed to handle different kinds of events triggered by different controls. The business logic of controls and the UI rendering of controls are separated. The business logic resides in the Siemens HMI runtime application, while the UI rendering is in a separate process. The key of this concept is to separate the concern: the UI rendering of a control and the business logic of the control. Hosting business logic in the runtime will allow sharing the stable and UI-independent business logic across multiple platforms. The architecture is required to work on both the Win32 operating system environment and the WinCE operating system environment. Kinds of.net framework are different in the Win32 and the WinCE operating system environments. The.NET CF in the WinCE operating system environment is a subset of the.net framework in the Win32 operating system environment, so the architecture must be designed generically so that it can be applied to both platforms without much of an effort. A prototype is needed to be implemented to validate the architecture on an embedded Panel device with the WinCE
21 operating system environment and a standard the Windows PC with Win32 operating system environment. 3.2 Components Definition There are three main components in the architecture: a native runtime client component, a.net client component which holds.net custom controls and a COM server component which provide communication interfaces between the native runtime client component and the.net client component. The native runtime client component is the HMI runtime application, which is keeping running. The business logic of controls is implemented in the native runtime client component. The business logic of controls should be generic. The.NET client component is a.net application which will hold.net custom controls during runtime. It has no knowledge of controls until they are loaded during runtime. The.NET client component should load.net custom controls by using DLL files. And the UI rendering work is done in the.net client component. The COM server component is designed to provide communication interfaces between the native runtime client component and the.net client component. It plays a communication bridge role in the architecture. 3.3 Communication Mechanism Introduction First, concept of managed code and unmanaged code needs to be introduced. Managed code is the code that executes under the control of the CLR. For example, any code written in C# or Visual Basic.NET belongs to managed code. While the code that runs outside the CLR is unmanaged code. COM components, ActiveX components, and
22 13 Win32 API functions are examples of unmanaged code. Unmanaged code is also called native code. In the architecture design, the native runtime client component is implemented using native code and the.net client component is implemented using managed code. The business logic of controls resides in the native runtime component and the UI rendering is in the.net client component, so a proper communication mechanism between managed code and unmanaged code must be established for the architecture. The architecture is required to work on both the Win32 operating system environment and the WinCE 6.0 operating system environment, so the communication mechanism for the architecture must be available on both the Win32 operating system environment and the WinCE 6.0 operating system environment. The.NET Framework is used in Win32 operating system environment and the.net CF is used in the WinCE operating system environment, therefore the interoperability between managed and unmanaged Code under the.net Framework and the.net CF is investigated. The.NET Framework 3.5 and the.net CF 3.5 which are used in the architecture are chosen to make a comparison Comparison of Interoperability between Managed and Unmanaged Code in.net Framework 3.5 and.net CF 3.5 The.NET CF is a subset of the.net Framework. The.NET CF supports about 30 percent of the namespaces and classes of the.net Framework, and is about 8 percent of its size. To keep the size small, only the most important classes and members are supported. The.NET CF also contains some features and classes that are specific to mobile and embedded development. The table below lists some comparison results of interoperability between managed and unmanaged code under the.net CF 3.5 and the.net Framework 3.5.
23 14 Evaluation item.net CF 3.5.NET Framework 3.5 Platform Invoke Supported Only one-way function calls from Supported Bidirectional calls managed code to native code MessageWindow Class Supported Communication from native code to managed code Not Supported Hosting the runtime Not supported Supported from native code Using regasm.exe to Not supported Supported register a managed component Activating managed Not supported Supported types from COM Hosting ActiveX Not supported Supported COM Interoperability controls Auto generating class interfaces Auto generating Globally Unique Identifier (GUID) Not supported You must wrap the functionality you d like to expose to native code in an explicit interface. Not supported You must give each interface an explicit GUID in order to expose it to native code. Supported Supported C++ Interoperability Not supported Supported Directly accessing a managed API from native code Not supported Supported Exposing a managed API as a COM API Not supported Supported Table 3.1 Comparison of interoperability between managed and unmanaged code under the.net CF 3.5 and the.net Framework 3.5 Evaluation Items in the table above will be discussed in the following section. Platform Invoke, MessageWindow Class and COM Interoperability are the main focus of the discussion Platform Invoke The.NET CF 3.5: Supported, One-way calls The.NET Framework 3.5: Supported, Bidirectional calls
24 15 Platform Invoke [9] is a feature in.net framework which is used to call methods in a native DLL from managed code. To call a method in a native DLL from managed code, you need to create a P/Invoke wrapper. A P/Invoke wrapper looks just like a declaration of a managed code method. Platform Invoke in.net Compact Framework 3.5 only supports one-way function calls, from managed code to native code, because Asynchronous delegates are not supported. Dynamic Link Library (DLL) Managed Code Native Code Figure 3.1 Schema of Platform Invoke in the.net CF 3.5 Platform Invoke in the.net Framework 3.5 supports bidirectional calls, both from managed code to native code, and callback methods from native code to managed code. Callbacks are supported through the use of delegates which are object oriented function pointers. Delegates pointing to a method in managed code are passed to the function in a native DLL. Then a function in the DLL can call the managed application at the address pointed by the delegate. Dynamic Link Library (DLL) Native Code Managed Code A call passes a pointer to the callback function Implementation of the callback function Figure 3.2 Schema of Platform Invoke in the.net Framework MessageWindow Class The.NET CF 3.5: Supported The.NET Framework 3.5: Not supported
25 16 MessageWindow [9] Class is a way for communicating from native code to managed code. MessageWindow Class is a wrapper around an empty, invisible Win32 window. It is able to send and receive window based messages. It also has a window handle just like ordinary Win32 windows. Using that window handle, native code can transmit a message into managed code by using its traditional ways like either the Win32 PostMessage or the Win32 SendMessage function. Then the WndProc method based on a Messagewindow method is invoked automatically in managed code. Thus, both native code and managed code use its familiar way to establish a communication from native code to managed code. MessageWindow Class is included in the.net CF 3.5 but not in the.net Framework 3.5. In fact, it is one of the features included in the.net CF 3.5 while not in the.net Framework. Native Code A function to accept the window handle value when called from managed code Platform Invoke Pass the window handle parameter Managed Code An instance of the MessageWindowderived class WndProc Method PostMessage/SendM essage function Send a message to Managed code Automatic invoking of WndProc method with the window handler parameter Figure 3.3 Schema of MessageWindow Class in the.net CF COM Interoperability The.NET CF 3.5: Supported with limitation The.NET Framework 3.5: Supported COM Interoperability [10] is a mechanism using existing COM object from managed code and calling a managed method from inside a COM object. There are two key concepts in COM Interoperability: Runtime Callable Wrapper (RCW) and COM Callable Wrapper (CCW).
26 17 RCW is a proxy used by CLR to expose native COM objects to managed code and then allow managed code to call functions in native COM objects. RCW appears as an ordinary object to managed code and it marshals call between managed code and native COM objects, so managed code and native COM objects use their familiar way to send and receive data. To use existing native COM objects from managed code, a reference to the native COM object should be added in the managed code and registered. After that, you can use native the COM object, just as you would use a managed object that exists in another assembly. CCW is a proxy used by CLR to expose managed code to native COM objects and then allow native COM objects to call functions in managed code exposed through native COM interfaces. CCW is used to marshal calls between managed and native code. It s possible for a native COM object to call back into managed code. A callback interface is defined first inside a native COM object and the implementation of the callback interface is defined in managed code. A reference of this implementation is passed to native COM objects. Then the COM object is able to make a callback to managed code. Common Language Runtime COM Object Runtime Callable Wrapper Managed Application COM Callable Wrapper Managed Object Figure 3.4 COM Interoperability in the.net CF 3.5
27 18 There are some restrictions about using native COM objects in the.net CF 3.5 Comparing to in the.net Framework In the.net CF 3.5, it is not supported to host the runtime from native code. A delegate or interface of a managed object must be passed to native code if you want to call this managed object from native code. In other words, it is always started out in managed code in order to expose it to native code. 2. In the.net CF 3.5, it is not supported to use an assembly registration tool like regasm.exe for registering a managed component as a COM class for native COM objects to use. 3. In the.net CF 3.5, it is not supported to activate managed types from a native COM object. 4. In the.net CF 3.5, it is not supported to host an ActiveX control from managed code since a managed application cannot act as an ActiveX container. Although.NET CF 3.5 does not support hosting an ActiveX control from managed code, it is possible to implement it by using such features like RCW, CCW, connection points, call backs and access to control handles. 5. In the.net CF 3.5, it is not supported to auto generate class interfaces. It is required to generate an explicit interface that wraps the functionality to expose to native code. 6. In the.net CF 3.5, it is not supported to auto generate GUID. It is required to assign an explicit GUID to each interface in order to expose it to native code C++ Interoperability The.NET CF 3.5: Not supported The.NET Framework 3.5: Supported This technique is a C++ specific feature, which allows managed and native code to exist in the same application and even in the same file. The C++ Interoperability feature allows the native APIs are used directly in managed code without having to use the DllImport attribute. This is done by including the header file and linking the import library.
28 19 However, this feature is available in a.net programming language only if it is managed extensions for C++. C++ Interoperability feature is not available in the.net CF 3.5 because managed extensions for C++ is not supported in the.net CF 3.5. Native APIs Managed C++ Application Figure 3.4 C++ Interoperability in the.net CF Directly Accessing a Managed API from native code The.NET CF 3.5: Not supported The.NET Framework 3.5: Supported Native code written in C++ can be compiled as a mixed mode image in the Visual Studio.NET C++ compiler. After this is done, the native code can directly access any managed API. However, there are some coding rules that apply to accessing managed objects from native code. This is a feature that is supported in the.net Framework 3.5 but not in the.net CF 3.5. Managed API Native Code (Complied as mixed mode image) Figure 3.5 Schema of directly accessing a managed API in the.net Framework Exposing a Managed API as a COM API The.NET CF 3.5: Not supported The.NET Framework 3.5: Supported Every public managed class can be exposed to native code through COM Interoperability. The CLR in COM Interoperability takes care of all the COM marshaling issues. This
29 20 feature must be used carefully because managed and COM object models are very different, which means some features available managed code may have no equivalent in COM field and not be usable in COM. Steps to exposing a managed API as c COM API are as below: 1. Register assemblies with COM objects. 2. Reference a managed API from COM objects. 3. Call a managed API. 4. Deploy an application for COM objects to access. This is a feature supported in the.net Framework 3.5 but not in the.net CF 3.5. Managed objects cannot be registered as COM objects in the.net CF 3.5. COM API Native Code Managed API Figure 3.6 Schema of exposing a managed API as a COM API in the.net Framework Evaluation Conclusion Platform Invoke is useful when you need something that is not supported by the.net Compact Framework but is supported by calling a function in a Win32 DLL. Platform Invoke is easy to implement, but the specific function to be called must be defined at the compilation time. So Platform Invoke is a static call. MessageWindow Class provides a way to communicate from native code to managed code in the.net CF 3.5. By using MessageWindow class, both native code and managed code use their familiar technique to establish the communication: native code uses window messages while managed code uses invocation of methods and access to properties of an object.
30 21 COM Interoperability makes the interoperability between native COM objects and managed code easier. Calling native COM objects from managed code is supported well in the.net CF 3.5. As for calling a function in managed code from native COM objects, there are some restrictions. Because hosting runtime from native code is not supported in the.net CF 3.5, it is not supported to call into managed code from native COM object directly. However, it is supported to call back into managed code from within a native COM object if the native COM object is hosted by managed code. C++ Interoperability, directly accessing a managed API from native code and exposing a managed API as a COM API are features that are supported in the.net Framework 3.5 but not in the.net CF3.5. They are not used in the architecture design Communication Mechanism Used in the Architecture After learning and comparing interoperability between Managed and Unmanaged Code under the.net CF 3.5 and the.net Framework 3.5 which is discussed in section 3.3.2, we need to choose proper communication mechanism for the architecture. MessageWindow class is mainly used to transfer messages. Although specific handler functions can be defined when a message is received, it has some limitations such as nonstring type parameters cannot be transferred. What s more, MessageWindow class is not support in the.net framework 3.5, which means it cannot meet the cross-platform requirement of the architecture that the architecture must work on both Win32 and WinCE operating system environment. C++ Interoperability, Directly accessing a managed API from native code and Exposing a managed API as a COM API are supported in the.net Framework 3.5 but not in the.net CF 3.5, which means it cannot meet the cross-platform requirement of the architecture that the architecture must work on both Win32 and WinCE operating system environment.
31 22 Platform Invoke can provide communication support from managed code to unmanaged code and COM Interoperability can provide communication support from unmanaged code to managed code. They are supported in both the.net framework 3.5 and the.net CF 3.5. Although Platform Invoke and COM Interoperability both have some usage limitation in the.net CF 3.5, proper combination use of these two communication mechanisms can meet the communication requirement of the architecture. As a result, Platform Invoke and COM Interoperability techniques are chosen for the communication mechanism of the architecture. 3.4 Possible Architecture Solutions Introduction The goal of this thesis is to develop a cross-platform.net custom control architecture. Because there is no existing solution for our architecture, possible solutions are needed to be proposed, evaluated, and the final solution is chosen from them. Possible solutions are evaluated one by one before the final solution is determined. In the process of finding the final solution, there are mainly three meaningful possible solutions Solution One In this architecture, the native runtime client component and the.net client component are executable programs in two separate processes. As a result, a bridge component is implemented for the communication between the native runtime client component and the.net client component. Because of the COM Interoperability in the.net Framework 3.5 and the.net CF 3.5, the bridge component is implemented as a COM server. In the architecture design of solution one, the COM server component is implemented as a DLL object to connect the native runtime client component and the.net client component. DLL is a module containing functions and data that can be used by another module (application or DLL). DLL is so commonly used that it is an
32 23 obvious possible way to connect the native runtime component and the.net client component. The COM server component is implemented in DLL type, which is an in-process COM server (a program that runs as a service to another program rather than a standalone one). The DLL generated by the COM server component is referred to the native runtime client component and the.net client component. Because the communication between the native runtime client component and the.net client component should be bidirectional, the COM server component is required to expose interfaces to the native runtime client component and the.net client separately. Figure 3.7 shows the architecture of solution one. Native Runtime Client Component In-process COM Server Component.NET Client Component.NET Custom Control Figure 3.7 Architecture of solution one In solution one, both the native runtime client component and the.net client component loads the DLL object of the COM server component in its own process. Then a critical problem comes out. The native runtime client component and the.net client component have their own copy of DLL object of the COM server component. The communication channel cannot be established since there are two different DLL objects. In order to fix this problem, The DLL object singleton [11] feature is considered, which ensures only a unique DLL object is created. However, implementing singletons in a DLL can cause some problems. One problem is if your singleton object marked "Apartment" is in a DLL, the two clients create two Single-Threaded Apartment (STA) threads, and each one creates a singleton object. Both STA threads have the same raw pointer to the singleton, allowing them to call into the singleton simultaneously. As a result, it is possible that
33 24 accessing to data in the singleton object is not synchronized. Then it is only a matter of time before data is corrupted. A temporary solution is to set data sharing section in multiple DLL objects like the code segment below: #pragma data_seg("flag_data") int count=0; #pragma data_seg() #pragma comment(linker,"/section:flag_data,rws") But it s too limited to just share some data, the communication between the native runtime client component and the.net client component includes not only data transaction but also method calling between them. Because the COM DLL object singleton issue cannot be solved in solution one, an improved solution is proposed to solve this problem Solution Two Because solution one has COM DLL object singleton issue, an alternative solution is needed. Solution two is modified based on solution one, which replace the in-process COM server component with an out of process COM server component. As a result, the COM DLL object is changed to a COM executable object. In the out of process COM server component, you can use the following syntax to declare COM object as a singleton: DECLARE_CLASSFACTORY_SINGLETON() Figure 3.8 shows the architecture of solution two. Native Runtime Client Component Out of process COM Server Component.NET Client Component.NET Custom Control Figure 3.8 Architecture of solution two
34 25 Solution two solves the singleton issue of the in-process COM server component successfully using an out of process COM server component. By declaring the out of process COM server component as a singleton, the native runtime client component and the.net client component access the same COM object when they call into the out of COM server component from each side, which means a communication channel between the native runtime client component and the.net client component can be established through the out of COM server component. Solution two works on the Win32 operating system environment well, however, an exception about custom data marshaling [12] (transforming the memory representation of an object to a format suitable for storage or transmission) between managed code and native code comes out when it is tested on the WinCE 6.0 operating system environment. In the architecture, methods calling between the.net client component and the native COM server component needs to take care of marshaling work. Especially, the custom data passed by the methods calling must be marshaled between these two components. This marshaling work is automatically handled by the.net Framework 3.5 in the Win32 operating system environment while the WinCE 6.0 operating system environment doesn t do the marshaling work automatically because of limited features supported by the.net CF 3.5. This marshaling work must be implemented manually in the WinCE 6.0 operating system environment. This is why solution two can work in the Win32 operating system environment but not in the WinCE 6.0 operating system environment. Although it is possible to do the marshaling work manually, it involves lots of trivial work and application readability will not be good. Due to this marshaling issue between managed code and native code in the WinCE 6.0 operating system environment, an improved solution is proposed to solve this problem Solution Three Solution three is improved from solution two. From solution two it is proved that the communication between the native.net client component and the out of process COM
35 26 server component has some limitations in the WinCE 6.0 operating system environment because of the limitations of the.net CF 3.5. Due to these limitations the marshaling of custom data types is leading to exception. This is not happening for the in-process COM server component. For this reason, a wrapper is added in our prototype. This wrapper is an in-process COM server DLL object which acts as a bridge between the.net client component and the out of process COM Server component. The COM server component is still an out of process COM server since we need a single COM server instance for both the.net client component and the native runtime client component. In order to solve the marshaling issue existed in solution two, an in-process COM server DLL object is designed as a wrapper around the out of process COM server component. The in-process COM server DLL object is embedded in the.net client component. The.NET client component communicate with the in-process COM server DLL object directly, and then the in-process COM server DLL object passes the communication to the out of process COM server component. As a result, the custom data marshaling issue between managed code and native code is eliminated. Figure 3.9 shows the architecture of solution three. Native Runtime Client Component Out of process COM Server Component Wrapper.NET Client Component.NET Custom Control Figure 3.9 Architecture of solution three Solution three is working on both the Win32 operating system environment and the WinCE 6.0 operating system environment without the exception problem caused by the custom data marshaling issue in solution two.
36 Conclusion Three possible solutions for the cross-platform.net custom control architecture are mainly discussed. Although solution one and solution two both haven t meet all the design requirements, they are the foundation of solution three, which is the final solution for the cross-platform.net custom control architecture for a Siemens HMI runtime application. Solution three is developed based on previous solutions solution one and solution two by continually being improved. In next section, the cross-platform.net custom control architecture is described in detail. 3.5 Cross-platform.NET Custom Control Architecture From the discussion of possible architectures in section 3.4, solution three is chosen as the final architecture solution. Figure 3.10 shows the cross-platform.net custom control architecture for the Siemens HMI runtime application. Native Runtime Client Component Out of process COM Server Component Wrapper.NET Client Component.NET Custom Control Figure 3.10 The cross-platform.net custom control architecture for the Siemens HMI runtime application The architecture contains a native runtime client component, an out of process COM server component, a.net client component and an in-process COM server DLL wrapper embedded in the.net client component. The native runtime client component is the HMI runtime application. The generic business logic of controls is implemented in the native runtime client component. The.NET client component holds.net custom controls. It loads.net custom controls during runtime. The UI rendering work is done in the.net client component.
37 28 The out of process COM server component provides communication interfaces for both the native runtime client component and the.net client component. It is declared as a singleton object so that the communication channel can be established. The in-process COM server wrapper is used to eliminate the marshaling work between the.net client component and the out of process COM server component. The detail implementation of the architecture is described in next chapter.
38 29 Chapter 4 Architecture Implementation 4.1 Introduction The.NET Framework 3.5 and the.net CF 3.5 is supported on the Win32 operating system environment and the WinCE 6.0 operating system environment separately. With the rich set of UI controls and their features available in the.net Framework, it becomes one of the preferred ways for creating and hosting UI components as part of control logic. The native runtime client component contains generic business logic for controlling all the controls, and the.net client component contains the UI rendering logic for the controls. Using.NET Framework as a development framework for control logic means that the UI framework will be based on managed code, and will not be able to directly invoke native runtime APIs. So it is needed to create a bridge component between the native runtime component and the.net client component. This bridge component will be an out of process COM server object and will be used for communication between the native runtime component and the.net client component and vice versa. The figure 4.1 shows the cross-platform.net custom control architecture. Native Runtime Client Component Out of process COM Server Component Wrapper.NET Client Component.NET Custom Control Fig 4.1: The cross-platform.net custom control architecture
39 30 The architecture should be designed as a cross-platform architecture according to the design requirement, which means the architecture implementation should work both on the Win32 operating system environment and the WinCE 6.0 operating system environment. Because the.net CF 3.5 on the WinCE 6.0 operating system environment is a limited version of the.net Framework 3.5 on the Win32 operating system environment, the architecture implementation should first be guaranteed to work under the WinCE 6.0 operating system environment, and then it is verified on the Win32 operating system environment. The architecture implementation is the same both on the Win32 operating system environment and WinCE 6.0 operating system environment. And the following description is based on WinCE 6.0 operating system environment. 4.2 Components Out of Process COM Server Component The out of process COM server component is an ATL [13] Smart Device Project for WinCE 6.0. It implements a communication channel between the Native runtime client component and the.net client component. It exposes three different interfaces. The first two interfaces are used for callback mechanism, one for the native runtime client component and the other for the.net client component. The methods which are declared in these two interfaces are not implemented by the out of process COM Server component but are implemented by the native runtime client component and the.net client component respectively. A reference to the implementation class is then registered with the out of process COM Server component. Once done the out of process COM server component can then invoke the callback methods when needed. The third interface contains methods which the native runtime client component and the.net client component invoke in order to initiate the communication between each other. Thus the native runtime client component and the.net client component communicate with the
40 31 out of process COM server component by calling the exposed APIs which are implemented in the out of process COM server component itself, and the out of process COM server component communicates with the native runtime client component and the.net client component using the callback APIs which are implemented in the two client components. In this case since the two client components will be communicating with each other through the out of process COM Server component, the out of process COM server is designed to run as a single instance server. And since it s an out of process COM object, it models a singleton. ATL objects normally acquire a class factory by deriving from CComCoClass. This class includes the macro DECLARE_CLASSFACTORY, which declares CComClassFactory as the default class factory. In order to model the singleton, CComClassFactorySingleton is needed to use, for which the DECLARE_CLASSFACTORY_SINGLETON macro is specified in the objects class definition, like the partial code below: class CMyClass :..., public CComCoClass<... > { public: DECLARE_CLASSFACTORY_SINGLETON(CMyClass)... }; CComClassFactorySingleton derives from CComClassFactory and uses CComObjectGlobal to construct a single object. Each call to the CreateInstance method simply queries this object for an interface pointer. In this way both the native runtime client component and the.net client component will receive the same interface pointer from the CreateInstance call, thus creating a communication channel. The WinCE 6.0 operating system environment does not support the automatic marshalling. Therefore, a proxy/stub marshaling code is needed to create to accompany with the out of process COM server component and the two client components and to make sure communication methods are properly marshaled across process boundaries. In the Win32 operating system environment, if only Object Linking and Embedding (OLE) automation compatible data types are used in the communication methods, it is not
41 32 necessary to provide the proxy/stub code as the automatic marshalling is always present there (as part of ole32.dll and oleaut32.dll). But if other data types are used, it is still needed to compile the proxy/stub code and register it in the Win32 operating system environment too. The proxy/stub project is Win32 Smart Device DLL project. It contains all the files that were generated in the out of process COM server component by the Microsoft Interface Definition Language (MIDL) complier. Besides, a.def file is created in the Proxy/Stub project. Content of the.def file is like below. LIBRARY Proxy/Stub Name EXPORTS DllGetClassObject DllCanUnloadNow GetProxyDllInfo DllRegisterServer DllUnregisterServer PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE There are also some configurations to set. One is to add the symbol REGISTER_PROXY_DLL in the Preprocessor Definition property in the proxy/stub project so that DllMain, DllRegisterServer and DllUnregisterServer functions are generated for automatically registering a proxy DLL. Another one is to add the Remote Procedure Call (RPC) library - rpcrt4.lib to the Additional Dependencies property in the proxy/stub project. At this point, the proxy/stub project is ready to build. The DLL file generated by the project has to be registered on the WinCE 6.0 operating system environment in order to expose the interfaces defined in the out of process COM server component NET Client Component The.NET client component is basically a container to hold all the controls. These controls makes up a complex.net user interface by taking the advantage of the power of the.net Framework, interact with the native runtime component, and are easily deployed and configured. Using the.net Framework as rendering framework provides a
42 33 rich user experience, and enhance user interface responsiveness by combined with data manipulation mechanisms of the native runtime component. The.NET client component is a Smart Device Application project for WinCE 6.0. It has support for all the controls included in the.net CF 3.5, and also supports.net custom controls. Controls included in the.net CF 3.5 can be added to the UI from the control toolbox..net custom controls are built into separate binaries which will be copied into a proper location before loaded into the.net client component. Below is the partial code for loading.net custom controls. using System; using System.Reflection; public void LoadAssembly( string strurl, string strclassname ) { Assembly a = Assembly.LoadFrom( strurl ); object o = a.createinstance( strclassname ); } The.NET custom control assemblies are dynamically loaded from a URL using the System.Reflection.Assembly class s LoadFrom function. The exact location of the file must be specified in the URL for the assembly to be loaded. The UI rendering logic will loop through all the properties and events of each control loaded once controls are loaded into the.net client component. The properties and events along with the control name and any value associated with it are sent to the native runtime client component, which then are mapped to their respective business logic. Generic interfaces are designed to handle any given property or event in the same manner. When the UI rendering logic encounters an event of a control, it will dynamically bind the event with an event handler, which forwards the control and event information to the native runtime component. In this way UI designer will not have to worry about event handling for controls, instead just build a rich user interface, and all the events are handled by the runtime.
43 Native Runtime Client Component The native runtime client component is a Win32 Smart Device Console Project for WinCE 6.0. In the native runtime client component, an implementation of callback interface for COM server calling back to the native runtime client component is defined. class CNativeClientCallBack : public INativeClientCallBack { public: STDMETHODIMP NotifyEvent(LPTSTR pcontrolname, LPTSTR peventtype, LPTSTR pvalue); STDMETHODIMP StoreProperty(LPTSTR pcontrolname, LPTSTR ppropertyname, LPTSTR pvalue); STDMETHODIMP StoreEvent(LPTSTR pcontrolname, LPTSTR peventtype, LPTSTR pvalue); }; Once the native runtime client component starts, it will create an object of the out of process COM server and an object of the callback interface implementation. Then the reference of the callback interface implementation object will be passed to the out of process COM server. After that, the out of process COM server can invoke the callback to the native runtime client component when it is needed. A business logic unit of all controls exists in the callback interface implementation. It will judge which event of which control loaded in the.net client component occurs according to the control s information sent from the.net client component. When there is a match, it will execute the specific business logic and send the control name, property name and new property value back to the.net client component to change the property of that control. Apart from receiving events notification from the.net client component, the native runtime client component also has a command line feature for user to input command directly to change the property of a certain control in the.net client component.
44 Communication Mechanism Communication between.net Client Component and Out of Process COM Server Component The.NET CF 3.5 supports COM Interoperability, with which interoperating with existing COM objects is achieved. To use existing COM objects from managed code, you can add a reference to the COM object in managed code. References to COM objects can be DLL, executable files, and type library a binary file that includes information about interfaces, types, and objects that a COM object exposes. Then an interoperability assembly is created and automatically added as a reference. The interoperability assembly contains managed types that allow you to program against native COM types. The interoperability assembly does not directly communicate with the COM object. Instead the CLR COM Interoperability layer inserts a special proxy between the managed code and the COM object. When interoperating with the COM object, a conversion process is necessary in order to convert argument data between managed code and the COM object. The.NET CF 3.5 supports marshaling of many different managed types both to and from the COM object. Each managed type that is supported has a default marshaling behavior. A simple COM server is used to explain the COM Interoperability in the architecture, as shown in figure 4.2. StoreControlProperty IUnknown ISimpleServer StoreControlEvent NotifyControlEvent Simp SetDOTNETClientCallback ResetDOTNETClientCallback SimpleCOMServer IDOTNETClientCallBack ChangeProperty INativeClientCallBack NotifyEvent
45 36 Fig 4.2 A simple COM server structure In figure 4.2 the COM object implements a COM server named SimpleCOMServer. It exposes three different interfaces apart from IUnknown interface. These three interfaces are ISimpleServer, IDOTNETClientCallBack and INativeClientCallBack. ISimpleServer interface contains methods used in the COM server. IDOTNETClientCallBack and INativeClientCallBack interfaces are the callback interfaces for the native runtime client component and the.net client component. The implementations of these two interfaces are in the two client components. After implementing the SimpleCOMServer object, the.net client component which is a new C# smart device project is needed to create. In order to communicate with the SimpleCOMServer object, the.net client component needs to refer to the DLL file of the SimpleCOMServer object that provides a description of the COM object and its interface. After then, an interoperability assembly is created by the compiler so that the.net client component can access methods of the SimpleCOMServer object. Before being able to use the methods in the SimpleCOMServer object, the following using directives statements need to be provided in the.net client component. using SimpleCOMServerLib; using System.Runtime.InteropServices; The "System.Runtime.InteropServices" namespace contains data types to support COM Interoperability. The "SimpleCOMServerLib" namespace contains managed types to expose the SimpleCOMServer object class and interfaces. After the using directives for these namespaces are added, the methods in SimpleCOMServer can be used in the.net client component. Below is an example of testbutton_click event handler in the.net client component which calls a method in the ISimpleServer interface of the SimpleCOMServer object. Implementing other event handlers is similar. In this scenario a RCW object is instantiated in managed code that wraps a native COM object and then cast to a managed interface describing the native COM interface. During runtime when the function is called and this stub is executed, the arguments are in-marshaled as specified, then the native function is called, and finally the out-marshaling occurs along
46 37 with some runtime post-processing, cleanup, and error handling. If an exception occurs during the in-marshaling process, the native function will not be called. namespace DOTNETClient { public partial class Form1 : Form { private ISimpleServer objsimpleserver = new SimpleServer(); } } public Form1() { InitializeComponent(); } private void testbutton_click(object sender, EventArgs e) { objsimpleserver.notifycontrolevent(testbutton.name.tostring(), "Click", "Main"); } Figure 4.3 illustrates calling into a SimpleCOMServer object from the.net client. Code you write Code generated for you Managed Method Call Application Code Interface ISimpleServer{ ChangeControlProperty( ) NotifyControlEvent( ) } Class SimpleCOMServer: ISimpleServer.NET CF Interop Layer.NET Client Interoperability Assembly COM Call ISimpleServer IDOTNETClientCallBack SimpleCOMServer COM Object Fig 4.3 Calling into a SimpleCOMServer object from the.net client component Since it is possible with the.net CF 3.5 to pass delegates to native code, you can pass a delegate to an exposed interface, resulting in the possibility for a COM object to call back into managed code. There are three interfaces in SimpleCOMServer - ISimpleServer, IDOTNETClientCallBack and INativeClientCallBack, as discussed before. Here the interfaces IDOTNETClientCallBack and INativeClientCallBack are used to call a method in the.net client component and the native runtime client component from the
47 38 SimpleCOMServer object. And specifically IDOTNETClientCallBack is used in context with the.net client component. In the example here, whenever there is a property change which needs to be updated in the UI, the SimpleCOMServer object is allowed to pass the name of the control, the property which needs to be changed, and the value to which it will be changed to the.net client component. Before being able to use the callback interface in SimpleCOMServer object, you have to pass a reference to an implementation of the callback interface to SimpleCOMServer. SimpleCOMServer Object Common Language Runtime Runtime Callable Wrapper ISimpleServer SetDOTNETClientCallBack ( IDOTNETClientCallBack*).NET Client Component IDOTNETClientCallBack, IUnknown, IDispatch COM Callable Wrapper IDOTNETClientCallBack ServerCallBack Fig 4.4 Communication between the.net client component and the out of process COM server component As shown below, the implementation of the IDOTNETClientCallBack interface is provided by the managed ServerCallBack class in the.net client component. class ServerCallBack : IDOTNETClientCallBack { public void ShowMsg(string pcontrolname, string ppropertyname, string pvalue) { MessageBox.Show("Change the " + ppropertyname + " Property of the " + ControlName + " Control to " + pvalue); } } To use the IDOTNETClientCallBack interface inside the SimpleCOMServer object, you have to pass a reference to its implementation from the.net client component. The
48 39 ISimpleServer interface in the SimpleCOMServer object provides the SetDOTNETClientCallback method for just this purpose, as shown in the code below. public partial class Form1 : Form { private ISimpleServer objsimpleserver = new SimpleServer(); private ServerCallBack objservercallback = new ServerCallBack(); public Form1() { InitializeComponent(); //Use the method of ISimpleServer to pass a callback object to SimpleCOMServer COM object objsimpleserver.setdotnetclientcallback((idotnetclientcallback)objservercallback); } } This code will pass an implementation of the IDOTNETClientCallBack interface to the SimpleCOMServer object, the SimpleCOMServer object then determines when to actually call back into the method provided by the interface Reason for Using In-process COM Server DLL The communication between the.net client component and the out of process COM server using COM interoperability has some limitations of marshaling custom data types in the.net CF 3.5 as explained in section 3.4.3, which leads to an exception. This is not happening for in-process COM server DLL. In order to solve this exception, an inprocess COM server DLL object is added in the architecture. This in-process COM server DLL object is designed as a wrapper around the out of process COM server component and acts as a bridge between the.net client component and the out of process COM Server component. The in-process COM server DLL exposes all the interfaces of the out of process COM server component which is needed for communication between the out of process COM server component and the.net client component. The.NET client component will refer to the in-process COM server DLL to communicate instead of the out of process COM server component, and the in-process COM server DLL will in turn communicate with the out of process COM server component. In this architecture, the ISimpleServer and
49 40 IDOTNETClientCallBack interfaces of the out of process COM server component will be exposed by the in-process COM server DLL Communication between Native Runtime Client Component and Out of Process COM Server Component Communication between the native runtime client component and the out of process COM server component is COM interoperability. The native runtime client component can call the methods in the out of process COM server component and the out of process COM server component can call back to the native runtime client component. Because both the native runtime client component and the out of process COM server component are native code, when communication between them occurs, no conversion process is needed and argument data can transfer directly between them. In order to use the out of process COM server object from the native runtime client component, you have to import the type library of the out of process COM server - a binary file including information about interfaces, types, and objects that a COM object exposes. You can use #import command to import the type library file (.tlb). The out of process COM server object is still the SimpleCOMServer described in figure 4.2, as shown in figure 4.5 below. ChangeControlProperty IUnknown ISimpleServer GetPropertyValue SetNativeClientCallback Simp ResetNativeClientCallback SimpleCOMServer IDOTNETClientCallBack ChangeProperty INativeClientCallBack NotifyEvent Fig 4.5 A Simple COM server structure
50 41 There are three interfaces in SimpleCOMServer - ISimpleServer, IDOTNETClientCallBack and INativeClientCallBack. Here the interfaces IDOTNETClientCallBack and INativeClientCallBack are used to call a method in the.net client component and the native runtime client component from the SimpleCOMServer object. And specifically INativeClientCallBack is used in context with the native runtime client component, as shown in figure 4.6 below. Native Runtime Client Component SimpleCOMServer Object ISimpleServer SetNativeClientCallBack ( INativeClientCallBack*) CNativeClientCallBack : public INativeClientCallBack INaitveClientCallBack IUnknown IDispatch Fig 4.6 Communication between the native runtime component and the out of process COM server component The native runtime client component is a Win32 Smart Device Console Project. Once it is created, the type library file of the COM Server is needed to import. #import "SimpleCOMServer.tlb" named_guids raw_interfaces_only Next an implementation of the callback interface is needed to define in the native runtime client component. As shown below, the implementation of INativeClientCallBack interface is defined in the CNativeClientCallBack class. class CNativeClientCallBack : public INativeClientCallBack { public: STDMETHODIMP ShowMsg(LPTSTR pcontrolname, LPTSTR peventtype, LPTSTR pvalue); STDMETHODIMP StoreProperty(LPTSTR pcontrolname, LPTSTR peventtype, LPTSTR pvalue); STDMETHODIMP StoreEvent(LPTSTR pcontrolname, LPTSTR peventtype, LPTSTR pvalue); public: CNativeClientCallBack(ISimpleServer* psimpleserver); ~CNativeClientCallBack(void); STDMETHODIMP QueryInterface(REFIID riid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); private: ULONG m_nrefcount; ISimpleServer* m_psimpleservercopy; };
51 42 To use the INativeClientCallBack interface inside the SimpleCOMServer object, a reference to its implementation is needed to pass from the native runtime client component. The ISimpleServer interface in the SimpleCOMServer object provides the SetNativeClientCallback method for just this purpose, as shown in the code below. int _tmain(int argc, _TCHAR* argv[]) { CNativeClientCallBack *m_pnativeclientcallback; ISimpleServer* m_psimpleserver; CoCreateInstance(CLSID_SimpleServer,NULL,CLSCTX_LOCAL_SERVER, uuidof(m_p SimpleServer),(void**)&m_pSimpleServer); m_pnativeclientcallback = new CNativeClientCallBack(m_pSimpleServer); m_psimpleserver->setnativeclientcallback((inativeclientcallback *)m_pnativeclientcallback); } This code will pass an implementation of the INativeClientCallBack interface to the SimpleCOMServer object, the SimpleCOMServer object then determines when to actually call back into the method provided by the interface. The complete communication between the native runtime component and the.net client component using the out of COM server component is shown as the figure 4.7 below. Native Runtime Client Component SimpleCOMServer Object Common Language Runtime Runtime Callable Wrapper ISimpleServer SetNativeClientCallBack ( INativeClientCallBack*) ISimpleServer SetDOTNETClientCallBack ( IDOTNETClientCallBack*).NET Client Component CNativeClientCal lback : public INativeClientCall Back INaitveClientCallBack IUnknown IDispatch IDOTNETClientCallBack IUnknown IDispatch COM Callable Wrapper IDOTNETClient CallBack ServerCall Back Fig 4.7 Communication between the native runtime client component and the.net client component using the out of COM server component
52 Interfaces The ISimpleServer, IDOTNETClientCallBack and INativeClientCallBack interfaces exposed by the out of process COM server component will be used to communicate between the native runtime client component and the.net client component. Following are the descriptions of the methods in these three interfaces ISimpleServer StoreControlEvent When the controls are loaded by the.net client component, it will loop through all the events of the loaded controls. If the loaded control is a faceplate, all the sub controls will also be scanned for available events. Each event along with the control name and any value associated with it, will be sent to the native runtime client component using StoreControlEvent(). Once received by the native runtime client component, the event information will be mapped to its respective business logic. HRESULT StoreControlEvent([in] LPTSTR pcontrolname, [in] LPTSTR peventtype, [in] LPTSTR pvalue); StoreControlProperty When the controls are loaded by the.net client component, it will loop through all the properties of the loaded controls. If the loaded control is a faceplate, all the sub controls will also be scanned for its properties. Each property along with the control name and any value associated with it, will be sent to the native runtime client component using StoreControlProperty(). Once received by the native runtime client component, the properties information will be stored. HRESULT StoreControlProperty([in] LPTSTR pcontrolname, [in] LPTSTR ppropertyname, [in] LPTSTR pvalue); NotifyControlEvent All the events which can be invoked from the loaded controls will be dynamically mapped to a common event handler, which will extract the event information, the information of the control whose event is fired, and information on any values associated with the fired event. The event handler will then pass this information to the native
53 44 runtime client component using NotifyControlEvent(). The business logic for handling the events will be part of the native runtime client component. HRESULT NotifyControlEvent([in] LPTSTR pcontrolname, [in] LPTSTR peventtype, [in] LPTSTR pvalue); ChangeControlProperty The native runtime client component contains all the information about the properties and their values for every control loaded by the.net client component. If a particular property of a control needs to be changed in the UI, the native runtime client component can notify that change to the.net client component, using ChangeControlProperty(). The control name, the property name and the value to be changed, will be sent to the.net client component, so as to apply the change in the UI. HRESULT ChangeControlProperty([in] LPTSTR pcontrolname, [in] LPTSTR ppropertyname, [in] LPTSTR pvalue); GetPropertyValue When the native runtime client component needs the value of a particular property of any control in the UI, GetPropertyValue() will be used to retrieve it. This method is designed because the native runtime client component needs to update the properties of the controls in its database after controls properties are changed. The native runtime client component will request the value by specifying the name of the control and the name of the property which needs to be updated. HRESULT GetPropertyValue([in] LPTSTR pcontrolname, [in] LPTSTR ppropertyname); SetDOTNETClientCallback The.NET client component and the native runtime client component will communicate to each other through the out of process COM server component. This communication will be facilitated through direct method calls and method call backs. The.NET client component can directly call functions in the out of process COM server component, but the out of process COM server component needs to use the callback interface registered by the.net client component to communicate back. The callback interface is defined in the out of process COM server but implemented in the.net client component.
54 45 SetDOTNETClientCallback() will be used by the.net client component to register the callback interface to the out of process COM server component. HRESULT SetDOTNETClientCallback([in] IDOTNETClientCallBack* pdotnetclientcallback); SetNativeClientCallback The native runtime client component and the.net client component will communicate to each other through the out of process COM server component. This communication will be facilitated through direct function calls and function call backs. The native runtime client component will directly call functions in the out of process COM server component, but the out of process COM server component needs to use the callback interface registered by the native runtime client component to communicate back. The callback interface is defined in the out of process COM server component but implemented in the native runtime client component. SetNativeClientCallback() will be used by native runtime client component to register the callback interface to the out of process COM server component. HRESULT SetNativeClientCallback([in] INativeClientCallBack* pnativeclientcallback); ResetDOTNETClientCallback ResetDOTNETClientCallback() will be used by the.net client component to unregister any callback interfaces registered to the out of process COM server component. Calling this method will disable any communication from the out of process COM server component to the.net client component. HRESULT ResetDOTNETClientCallback(void); ResetNativeClientCallback ResetNativeClientCallback() will be used by the native runtime client component to unregister any callback interfaces registered to the out of process COM server component. Calling this method will disable any communication from COM server to the native runtime client component. HRESULT ResetNativeClientCallback(void); IDOTNETClientCallBack
55 46 ChangeProperty ChangeControlProperty() called from the native runtime client component to the out of process COM server will be forwarded by the out of process COM server component to the.net client component using the ChangeProperty() callback method. A reference to the implementation of IDOTNETClientCallBack interface needs to be registered first by the.net client component in the out of process COM Server component. HRESULT ChangeProperty([in] LPTSTR pcontrolname, [in] LPTSTR ppropertyname, [in] LPTSTR pvalue); GetPropertyValues When the native runtime client component requests the.net client component for the value of a particular property in a control, it will call GetPropertyValue() method in the out of process COM server component, which will be forwarded by the out of process COM server component to the.net client component using the GetPropertyValues() callback method. A reference to the implementation of IDOTNETClientCallBack interface needs to be registered first by the.net client component in the out of process COM Server component. HRESULT GetPropertyValues([in] LPTSTR pcontrolname, [in] LPTSTR ppropertyname); INativeClientCallBack NotifyEvent When an event is fired from a control loaded in the.net client component, the.net client component will call the NotifyControlEvent() method in the out of process COM server component with the complete event information. The out of process COM server component will then forward the information to the native runtime client component using the NotifyEvent() callback method. The implementation of NotifyEvent() is in native runtime component and contains the business logic for handling the event. A reference to the implementation of INativeClientCallBack interface needs to be registered first by the native runtime client component in the out of process COM Server component. HRESULT NotifyEvent([in] LPTSTR pcontrolname, [in] LPTSTR peventtype, [in] LPTSTR pvalue);
56 47 StoreProperty When a control is loaded in the.net client component, the.net client component will loop through all the properties of that control and its sub controls and will call StoreControlProperty() method in the out of process COM server component with the properties information. The out of process COM server component will then forward the information to the native runtime client component using the StoreProperty() callback method, and the properties will be stored in the out of process COM server component. A reference to the implementation of INativeClientCallBack interface needs to be registered first by the native runtime client component in the out of process COM Server component. HRESULT StoreProperty([in] LPTSTR pcontrolname, [in] LPTSTR peventtype, [in] LPTSTR pvalue); StoreEvent When a control is loaded in the.net client component, the.net client component will loop through all the events which can be fired using the loaded control and its sub controls and will call StoreControlEvent() method in the out of process COM server component with the properties information. The out of process COM server component will then forward the information to the native runtime client component using the StoreEvent() callback method, and the events will be mapped to their respective business logic. A reference to the implementation of INativeClientCallBack interface needs to be registered first by the native runtime client component in the out of process COM Server component. HRESULT StoreEvent([in] LPTSTR pcontrolname, [in] LPTSTR peventtype, [in] LPTSTR pvalue);
57 48
58 49 Chapter 5 Verification of Architecture Prototype 5.1 Introduction A prototype is developed to implement the cross-platform.net custom control architecture discussed in chapter four. In this chapter, verification [13] of functionalities of the prototype is introduced. Then the prototype efficiency is tested by measuring the time overhead ratio for method calling in the prototype. 5.2 Functionalities Verification The cross-platform.net custom control architecture should implement bidirectional communication between the native runtime client component and the.net client component. For example, when a.net custom control is triggered by the user, the event should be transferred to the native runtime component through the out of process COM server component. After the business logic of controls in the native runtime client component receives the event, it should match corresponding handling logic for this event, and pass back correct handing information to UI rendering in the.net client component so that UI rendering can do the right rendering work. Four scenarios are designed to verify the complete functionalities in the prototype in the Win32 operating system environment and the WinCE 6.0 operating system environment. Tests of these four scenarios are passed and the functionalities of the architecture are verified Scenario One Scenario one is to print out all properties and events name of the loaded control. When a custom control is loaded in the.net client component, all properties and events name of the loaded control will be printed out on the console window of the native runtime client component.
59 50 Following is how this scenario works in the architecture: 1. When a.net custom control is loaded, the.net client component will call the SendAllEvents()method and the SendAllProperties() method. 2. In the SendAllEvents() method and the SendAllProperties() method, the.net client component will look for every event/property of the loaded control and pass the control and the event/property name information to the out of process COM server component by calling the StoreControlEvent() method and the StoreControlProperty() method. 3. Then the out of process COM server component will call the StoreEvent() method and the StoreProperty() method defined in the INativeClientCallBack interface implementation in the native runtime client component to display the name information on the console window Scenario Two Scenario two is to change the background color of the button_click button in the ClickCountingButton control when the button_click button is clicked. When the button_click button is clicked, the background color of the button_click button in the ClickCountingButton control will be changed to red. Following is how this scenario works in the architecture: 1. All the events which can be invoked from the controls loaded in the.net client component will be dynamically mapped to the Common_Event_Handler() method. 2. When the button_click button is clicked, the.net client component will call the Common_Event_Handler() method. 3. In the Common_Event_Handler() method, the.net client component will pass the name of button_click button and the name of click event to the out of process COM server component by calling the NotifyControlEvent() method. 4. Then the out of process COM server component will call the NotifyEvent() method defined in the INativeClientCallBack interface implementation in the
60 51 native client component to pass those information. Business logic for handling control events is defined in the NotifyEvent() method. 5. The business logic for handling the click event of the button_click button will pass the name of the button_click button, the name of the BackColor property and the name of color to be changed to the out of process COM server component by calling the ChangeControlProperty() method. 6. Then the out of process COM server component will call the ChangeProperty() method defined in the IDOTNETClientCallBack interface implementation in the.net client component to change the background color of the button_click button in the ClickCountingButton control Scenario Three Scenario three is to fill in the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control from the console window of the native runtime client component using command line. Users can fill in the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control from the console window of the native runtime client component. Following is how this scenario works in the architecture: 1. In the console window of the native runtime client component, press F1 to input commands. Input the control name, the property name and the new property value to be changed according to prompt message. In scenario three, those are the names of the textbox_firstname textbox and the textbox_lastname textbox, the name of the Text property and text to fill in. 2. When input process is finished, the native runtime client component will pass the input values to the out of process COM server component by calling the ChangeControlProperty() method. 3. Then the out of process COM server component will call the ChangeProperty() method defined in IDOTNETClientCallBack interface implementation in
61 52 the.net client component to fill in the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control Scenario Four Scenario four is to display text of the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control in the console window of the native runtime client component. When the button_viewmessage button is clicked, text of the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control will be displayed in the console window of the native runtime client component. Following is how this scenario works in the architecture: 1. When the button_viewmessage button is clicked, the.net client component will call the Common_Event_Handler() method. 2. In the Common_Event_Handler() method, the.net client component will pass the name of the button_viewmessage button and the name of click event to the out of process COM server component by calling the NotifyControlEvent() method. 3. Then the out of process COM server component will call the NotifyEvent() method defined in the INativeClientCallBack interface implementation in the native runtime client component to pass those information. Business logic for handling control events is defined in the NotifyEvent() method. 4. The business logic for handling click event of the button_viewmessage button will pass the names of the textbox_firstname textbox and the textbox_lastname textbox, and the name of Text property to the out of process COM server component by calling the GetPropertyValue() method. 5. Then the out of process COM server component will call the GetPropertyValues() method defined in the IDOTNETClientCallBack interface implementation in the.net client component to get the text content of the textbox_firstname textbox and the textbox_lastname textbox.
62 53 6. After getting the text content, the.net client component will pass the names of the textbox_firstname textbox and the textbox_lastname textbox, the name of Text property and the text content of those two textboxes to the out of process COM server component by calling the StoreControlProperty() method. 7. Then out of process COM server component will call the StoreProperty() method defined in the INativeClientCallBack interface implementation in the native runtime client component to display the text content of the textbox_firstname textbox and the textbox_lastname textbox in the NameRegistrationForm control in the console window of the native runtime client component. 5.3 Prototype Efficiency The time overhead for methods calling between the native runtime client component, the out of process COM server component and the.net client component in the prototype is measured to test the efficiency of the prototype. The ChangeControlProperty() method calling is taken as the measuring scenario: When a document number in a drop list control is selected, the specific document content is displayed in the text box control in the.net client component. Measuring test is repeated six times to get the average value. The total time for the measuring scenario, the total overhead time, and the constitution of the total overhead time will be measured. The time overhead under the WinCE 6.0 operating system environment and the Win32 operating system environment is measured. Following time efficiency results are under the WinCE 6.0 operating system environment. The results on the Win32 operating system environment is similar to that in the WinCE 6.0 operating system environment, but with smaller time overhead and time overhead ratio Overhead Definition When the native runtime client component receive the event of the drop list control to display a document content, it will call the ChangeControlProperty() method in the out of
63 54 process COM server component, and the out of process COM server component will forward this call to the in-process COM server wrapper, then to the.net client component. The.NET client component will create a separate thread to execute the method of display specific document content. NativeClient SimpleCOMServer SimpleCOMInteropBridge DOTNETClient (Container) Controls Fig 5.1 Method calling path in the test scenario The time used for initialing instance and passing parameters between the native runtime client component, the out of process COM server component and the.net client component constitutes the total communication overhead Overhead Measurement Tool High Resolution Timer is used at the.net client component for recording the SetValue time. This timer provides more precise measurements than you can obtain by using the TickCount property, which has 1-millisecond resolution. And for the native runtime client component, QueryPerformanceCounter system method is used. We declared a start timer and an end timer in the call functions for each component. Following the logical sequence, the receiver s start timer minus caller s start timer is one part of communication time. From the native client component to the out of COM server component QueryPerformanceCounter(&strt_ChangeControlProperty); //start timestop m_psimpleservercopy->changecontrolproperty(pcontrolname, peventtype, pvalue); QueryPerformanceCounter(&ed_ChangeControlProperty); //end timestop
64 55 From the out of COM server component to the.net client component QueryPerformanceCounter(&strt_ChangeControlProperty); //start timestop m_pdotnetclientcallbackintf->changecontrolproperty(pcontrolname, ppropertyname, pvalue); QueryPerformanceCounter(&ed_ChangeControlProperty); //end timestop The SetValue time in the.net client component strt_setvalue = timer.value; //Start timestop p.setvalue(control, currentcolor, null); ed_setvalue = timer.value;//end timestop Measuring Overhead The scenario for measuring overhead is like this. A document number from the drop list control is selected, and then the.net client component will send this number to the native runtime client component. After receiving the number, the native runtime client component returns the specific document name according to the document number to the.net client component. The.NET client component will display the content of the document in the text box control. In order to test how the control complexity affects time overhead, a small and a large size documents are used to test to compare the time overhead. Below are the measuring results for displaying a small (3 kilobyte) size document. The time unit is millisecond. Iterance Overhead Total Time Display File Time Overhead Ratio % % % % % % Average % Table 5.2 Time overhead for displaying a small size document
65 56 Iterance Direction Overhead Native Runtime Component and COM within COM COM and COM Bridge DLL COM Bridge DLL and.net Client Total 1 Call Return Call Return Call Return Call Return Call Return Call Return *Average Table 5.3 Constitution of total overhead time for displaying a small size document *Average Calculation does not take the 1st result into account. From the table 5.2, it is seen that the communication time in the first time test is milliseconds and the time overhead ratio is 15.1%, which takes more time than the following test results. This is because some initial work is needed to do at the first time test. After that, the time overhead stays stable like 3.4 milliseconds and the time ratio stays overhead like 12.8%. From the table 5.3, it is seen that the communications between the native runtime client component and the out of process COM server component, the out of process COM server component and the in-process COM Bridge DLL are critical. This is because these communications cross different processes and need to take care of marshaling issue, which costs some time. In order to compare time overhead of displaying different size documents, we test time overhead with a large document. Below are the measuring results for displaying a large (12 kilobyte) size document.
66 57 Iterance Overhead Total Time Display File Time Overhead Ratio % % % % % % Average % Table 5.4 Time overhead for displaying a large size document Iterance Direction Overhead Native Runtime Component and COM within COM COM and COM Bridge DLL COM Bridge DLL and.net Client Total 1 Call Return Call Return Call Return Call Return Call Return Call Return *Average Table 5.5 Constitution of total overhead time for displaying a large size document *Average Calculation does not take the 1st result into account. From table 5.4, it is seen that the communication time in the first time test is milliseconds and the time overhead ratio is 10.6%, which takes more time than the following test results. This is because some initial work is needed to do at the first time test. After that, the time overhead stays stable like 3.4 milliseconds and the time overhead ratio stays like 7.1%. From table 5.5, it is seen that the communications between the native runtime client component and the out of process COM server component, the out of process COM server component and the in-process COM Bridge DLL are critical. This is because these
67 58 communications cross different processes and need to take care of marshaling issue, which costs some time. By comparing the time overhead results of displaying a small document and a large size document, it is concluded that the time overhead is fixed no matter how complex the control is. The more complex the control is, the more time used to handle the event is, so that the time overhead ratio is smaller.
68 59 Chapter 6 Conclusion and Future Work 6.1 Conclusion In this thesis, a cross-platform.net custom control architecture for a Siemens HMI runtime application is developed, and a prototype of this architecture is implemented. This architecture is successfully tested on the Win32 operating system environment and the WinCE 6.0 operating system environment to demonstrate the functionality and efficiency. The cross-platform.net custom control architecture meets the following design requirements. 1. The.NET client component can load not only standard controls provided by the HMI, but also the.net custom controls like user-design controls or controls developed by a third party. 2. The business logic for controls and UI rendering for controls are separated. The business logic resides in the native runtime client component, while the UI rendering is in the.net client component which is in a separate process. The business logic of controls is designed generically to handle different control events no matter what kind of custom controls are loaded during runtime. 3. All the features used in the architecture are supported in both the.net Framework 3.5 and the.net CF 3.5. The prototype is verified on an embedded Panel device with the WinCE 6.0 operating system environment and a standard Windows PC with the Win32 operating system environment. 4. The functionality and efficiency of the architecture are tested. Test results shows that the functionality is complete and operating. The time overhead of the architecture is low enough to prove the architecture has a good efficiency. The final architecture for the cross-platform.net custom control is defined as figure 6.1.
69 60 Native Runtime Client Component Out of process COM Server Component Wrapper.NET Client Component.NET Custom Control Figure 6.1 The cross-platform.net custom control architecture for a Siemens HIM runtime application The architecture contains a native runtime client component, an out of process COM server component, a.net client component and an in-process COM server DLL wrapper embedded in the.net client component. The native runtime client component is the HMI runtime application. The generic business logic of controls is implemented in the native runtime client component. The.NET client component holds.net custom controls. It loads.net custom controls during runtime. The UI rendering work is done in the.net client component. The out of process COM server component provides communication interfaces for both the native runtime client component and the.net client component. It is declared as a singleton object so that the communication channel can be established. The in-process COM server wrapper is used to eliminate the marshaling work between the.net client component and the out of process COM server component, and it is embedded in the.net client component. A prototype is implemented to verify the architecture. Verification of the architecture prototype mainly includes two parts: functionalities verification and prototype efficiency, both of which are verified successfully. The results of functionalities verification prove that functionalities of the architecture are complete and the architecture is a solution for
70 61 the cross-platform.net custom control architecture. The results of prototype efficiency demonstrate the architecture has a reasonable efficiency. 6.2 Future Work Currently only.net custom controls are supported in the architecture. We hope that native custom controls can be supported in future work, which means both.net custom controls and native custom controls can be loaded in the container in the.net client component. Because the container is.net code itself, a proper wrapper between native custom controls and the container should be developed. According to the research of interoperability between managed code and native code in this thesis, it might be possible to find such a solution. From the time overhead results we can see that most time overhead is caused by the cross-process communication. So it is meaningful to consider minimizing the number of components in separate processes in current architecture. Now the number of components in separate processes is three. We can try to minimize the number of components to two by embedding the out of COM server component to the native runtime client component and verify the functionality and the efficiency of the new architecture. If the new architecture with two components can improve the efficiency, it proves this is a correct way to improve the architecture. Then we can continue trying to minimize the number of components to one by embedding the.net client component to the native runtime client component by using proper wrapper. Finally, an architecture which can improve the efficiency with complete functionality should be developed.
71 62 References [1] B. Laurel, The Art of Human-Computer Interface Design. Addison-Wesley Professional, Jan [2] F. Nachreiner, P. Nickel, and I. Meyer, Human factors in process control systems: The design of human machine interfaces in Safety Science, vol. 44, no. 1, pp. 5-26, Jan [3] C. Microsoft, Varieties of Custom Controls. [4] C. Microsoft, Shell, GWES, and User Interface: Windows Embedded CE [5] K. Cwalina and B. Abrams, Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable.NET Libraries, 2nd Ed. Addison-Wesley Professional, Nov [6] J. Kuhner, Expert.NET Micro Framework (Expert's Voice in.net). Apress, Apr [7] W. Emmerich and N. Kaveh, Component technologies: Java beans, COM, CORBA, RMI, EJB and the CORBA component model in Software Engineering, ICSE Proceedings of the 24rd International Conference on (2002), pp [8] C. Microsoft, An Overview of Managed/Unmanaged Code Interoperability. [9] Paul Yao and David Durant, Programming.NET Compact Framework 3.5, 2nd Ed. Addison-Wesley Professional, Sep [10] D. S. Platt, Essence of COM (Microsoft Technology), 3rd Ed. Prentice Hall International, May [11] C. Microsoft, Description of an alternative implementation of ATL singleton in Visual C [12] Alan Gordon, The.NET and COM Interoperability Handbook. Prentice Hall PTR, Dec, 2002.
72 63 [13] Richard Grimes, Julian Templeman and George V. Reilly, Beginning ATL 3 COM Programming, 1st Ed. Peer Information, Oct [14] P. Cousot and R. Cousot, Verification of embedded software: Problems and perspectives in Lecture Notes in Computer Science, vol. 2211, pp , 2001.
Introducing the.net Framework 4.0
01_0672331004_ch01.qxp 5/3/10 5:40 PM Page 1 CHAPTER 1 Introducing the.net Framework 4.0 As a Visual Basic 2010 developer, you need to understand the concepts and technology that empower your applications:
Choosing a Development Tool
Microsoft Dynamics GP 2013 R2 Choosing a Development Tool White Paper This paper provides guidance when choosing which development tool to use to create an integration for Microsoft Dynamics GP. Date:
An Easier Way for Cross-Platform Data Acquisition Application Development
An Easier Way for Cross-Platform Data Acquisition Application Development For industrial automation and measurement system developers, software technology continues making rapid progress. Software engineers
Advanced Web Application Development using Microsoft ASP.NET
Course Outline Other Information MS2311 Days 3 Starting Time 9:00 Finish Time 4:30 Lunch & refreshments are included with this course. Advanced Web Application Development using Microsoft ASP.NET Course
Advanced Web Application Development using Microsoft ASP.NET
Key Data Course #: 2311A Number of Days: 3 Format: Instructor-Led Certification Exams: Exam 70-305: Developing and Implementing Web Applications with Microsoft Visual Basic.NET and Microsoft Visual Studio.NET
Input/Output Subsystem in Singularity Operating System
University of Warsaw Faculty of Mathematics, Computer Science and Mechanics Marek Dzikiewicz Student no. 234040 Input/Output Subsystem in Singularity Operating System Master s Thesis in COMPUTER SCIENCE
Module 17. Client-Server Software Development. Version 2 CSE IIT, Kharagpur
Module 17 Client-Server Software Development Lesson 42 CORBA and COM/DCOM Specific Instructional Objectives At the end of this lesson the student would be able to: Explain what Common Object Request Broker
Dynamic Web Programming BUILDING WEB APPLICATIONS USING ASP.NET, AJAX AND JAVASCRIPT
Dynamic Web Programming BUILDING WEB APPLICATIONS USING ASP.NET, AJAX AND JAVASCRIPT AGENDA 1. Introduction to Web Applications and ASP.net 1.1 History of Web Development 1.2 Basic ASP.net processing (ASP
Integrating the Internet into Your Measurement System. DataSocket Technical Overview
Integrating the Internet into Your Measurement System DataSocket Technical Overview Introduction The Internet continues to become more integrated into our daily lives. This is particularly true for scientists
Introduction CORBA Distributed COM. Sections 9.1 & 9.2. Corba & DCOM. John P. Daigle. Department of Computer Science Georgia State University
Sections 9.1 & 9.2 Corba & DCOM John P. Daigle Department of Computer Science Georgia State University 05.16.06 Outline 1 Introduction 2 CORBA Overview Communication Processes Naming Other Design Concerns
The full setup includes the server itself, the server control panel, Firebird Database Server, and three sample applications with source code.
Content Introduction... 2 Data Access Server Control Panel... 2 Running the Sample Client Applications... 4 Sample Applications Code... 7 Server Side Objects... 8 Sample Usage of Server Side Objects...
Programmabilty. Programmability in Microsoft Dynamics AX 2009. Microsoft Dynamics AX 2009. White Paper
Programmabilty Microsoft Dynamics AX 2009 Programmability in Microsoft Dynamics AX 2009 White Paper December 2008 Contents Introduction... 4 Scenarios... 4 The Presentation Layer... 4 Business Intelligence
CA Data Protection. Content Provider Development Guide. Release 15.0
CA Data Protection Content Provider Development Guide Release 15.0 This Documentation, which includes embedded help systems and electronically distributed materials (hereinafter referred to as the Documentation
The Microsoft Way: COM, OLE/ActiveX, COM+ and.net CLR. Chapter 15
The Microsoft Way: COM, OLE/ActiveX, COM+ and.net CLR Chapter 15 Microsoft is continually reengineering its existing application and platform base. Started with VBX, continued with OLE, ODBC, ActiveX,
70-536VB:.NET Framework 2.0 - Application Development Foundation Course Introduction
70-536VB:.NET Framework 2.0 - Application Development Foundation Course Introduction 8m Module 01 - Working with Data Types Working with Data Types Working with Value Types Making Your Own Structures Using
PIE. Internal Structure
PIE Internal Structure PIE Composition PIE (Processware Integration Environment) is a set of programs for integration of heterogeneous applications. The final set depends on the purposes of a solution
2311A: Advanced Web Application Development using Microsoft ASP.NET Course 2311A Three days Instructor-led
2311A: Advanced Web Application Development using Microsoft ASP.NET Course 2311A Three days Instructor-led Introduction This three-day, instructor-led course provides students with the knowledge and skills
Manage Software Development in LabVIEW with Professional Tools
Manage Software Development in LabVIEW with Professional Tools Introduction For many years, National Instruments LabVIEW software has been known as an easy-to-use development tool for building data acquisition
Developing and Implementing Windows-Based Applications With Microsoft Visual C#.NET and Microsoft Visual Studio.NET
Unit 40: Developing and Implementing Windows-Based Applications With Microsoft Visual C#.NET and Microsoft Visual Studio.NET Learning Outcomes A candidate following a programme of learning leading to this
Developing a Web Server Platform with SAPI Support for AJAX RPC using JSON
Revista Informatica Economică, nr. 4 (44)/2007 45 Developing a Web Server Platform with SAPI Support for AJAX RPC using JSON Iulian ILIE-NEMEDI, Bucharest, Romania, [email protected] Writing a custom web
SPAMfighter Mail Gateway
SPAMfighter Mail Gateway User Manual Copyright (c) 2009 SPAMfighter ApS Revised 2009-05-19 1 Table of contents 1. Introduction...3 2. Basic idea...4 2.1 Detect-and-remove...4 2.2 Power-through-simplicity...4
Windows Presentation Foundation: What, Why and When
Windows Presentation Foundation: What, Why and When A. WHY WPF: WPF is framework to build application for windows. It is designed for.net influenced by modern display technologies like HTML and Flash and
INTERNET PROGRAMMING AND DEVELOPMENT AEC LEA.BN Course Descriptions & Outcome Competency
INTERNET PROGRAMMING AND DEVELOPMENT AEC LEA.BN Course Descriptions & Outcome Competency 1. 420-PA3-AB Introduction to Computers, the Internet, and the Web This course is an introduction to the computer,
Lehrstuhl für Informatik 4 Kommunikation und verteilte Systeme. Middleware. Chapter 8: Middleware
Middleware 1 Middleware Lehrstuhl für Informatik 4 Middleware: Realisation of distributed accesses by suitable software infrastructure Hiding the complexity of the distributed system from the programmer
Filestream Ltd. File Stream Document Management Integration Overview
Filestream Ltd File Stream Document Management Integration Overview (C) Filestream Ltd 2011 Table of Contents Introduction... 3 Components... 3 General API... 4 Command Line Search... 6 Search Shortcut
Introducing Micro Focus Net Express to Develop and Extend COBOL Applications within.net White Paper
Introducing Micro Focus Net Express to Develop and Extend COBOL Applications within.net White Paper Abstract This paper will introduce the capabilities of Micro Focus Net Express that allows COBOL to operate
Objectives. Chapter 2: Operating-System Structures. Operating System Services (Cont.) Operating System Services. Operating System Services (Cont.
Objectives To describe the services an operating system provides to users, processes, and other systems To discuss the various ways of structuring an operating system Chapter 2: Operating-System Structures
The ArcGIS Server architecture
2 The ArcGIS Server architecture ArcGIS Server is an object server for ArcObjects. The ArcGIS Server software system is distributed across multiple machines. Each aspect of ArcGIS Server plays a role in
Demo: Controlling.NET Windows Forms from a Java Application. Version 7.3
Demo: Controlling.NET Windows Forms from a Java Application Version 7.3 JNBridge, LLC www.jnbridge.com COPYRIGHT 2002 2015 JNBridge, LLC. All rights reserved. JNBridge is a registered trademark and JNBridgePro
Introduction to Web Services
Department of Computer Science Imperial College London CERN School of Computing (icsc), 2005 Geneva, Switzerland 1 Fundamental Concepts Architectures & escience example 2 Distributed Computing Technologies
.NET Overview. Andreas Schabus Academic Relations Microsoft Österreich GmbH [email protected] http://blogs.msdn.
Based on Slides by Prof. Dr. H. Mössenböck University of Linz, Institute for System Software, 2004 published under the Microsoft Curriculum License.NET Overview Andreas Schabus Academic Relations Microsoft
A Real Time, Object Oriented Fieldbus Management System
A Real Time, Object Oriented Fieldbus Management System Mr. Ole Cramer Nielsen Managing Director PROCES-DATA Supervisor International P-NET User Organisation Navervej 8 8600 Silkeborg Denmark [email protected]
Service Oriented Architecture
Service Oriented Architecture Charlie Abela Department of Artificial Intelligence [email protected] Last Lecture Web Ontology Language Problems? CSA 3210 Service Oriented Architecture 2 Lecture Outline
Interface Definition Language
Interface Definition Language A. David McKinnon Washington State University An Interface Definition Language (IDL) is a language that is used to define the interface between a client and server process
The Java Series. Java Essentials I What is Java? Basic Language Constructs. Java Essentials I. What is Java?. Basic Language Constructs Slide 1
The Java Series Java Essentials I What is Java? Basic Language Constructs Slide 1 What is Java? A general purpose Object Oriented programming language. Created by Sun Microsystems. It s a general purpose
Building Applications Using Micro Focus COBOL
Building Applications Using Micro Focus COBOL Abstract If you look through the Micro Focus COBOL documentation, you will see many different executable file types referenced: int, gnt, exe, dll and others.
Agile Business Suite: a 4GL environment for.net developers DEVELOPMENT, MAINTENANCE AND DEPLOYMENT OF LARGE, COMPLEX BACK-OFFICE APPLICATIONS
Agile Business Suite: a 4GL environment for.net developers DEVELOPMENT, MAINTENANCE AND DEPLOYMENT OF LARGE, COMPLEX BACK-OFFICE APPLICATIONS In order to ease the burden of application lifecycle management,
Custom Tasks for SAS. Enterprise Guide Using Microsoft.NET. Chris Hemedinger SAS. Press
Custom Tasks for SAS Enterprise Guide Using Microsoft.NET Chris Hemedinger SAS Press Contents About This Book... ix About The Author... xiii Acknowledgments...xv Chapter 1: Why Custom Tasks... 1 Why Isn
Changing the embedded development model with Microsoft.NET Micro Framework
Changing the embedded development model with Microsoft.NET Micro Framework The development model for embedded devices is traditionally viewed as extremely complex with the need for highly specialized design
Flexible, Scalable and independent HMI software for today s world
Simple, powerful and independent HMI software Flexible, Scalable and independent HMI software for today s world All the experience and technology of Progea in SCADA supervision software is now available
FreeForm Designer. Phone: +972-9-8309999 Fax: +972-9-8309998 POB 8792, Natanya, 42505 Israel www.autofont.com. Document2
FreeForm Designer FreeForm Designer enables designing smart forms based on industry-standard MS Word editing features. FreeForm Designer does not require any knowledge of or training in programming languages
GETTING STARTED WITH ANDROID DEVELOPMENT FOR EMBEDDED SYSTEMS
Embedded Systems White Paper GETTING STARTED WITH ANDROID DEVELOPMENT FOR EMBEDDED SYSTEMS September 2009 ABSTRACT Android is an open source platform built by Google that includes an operating system,
Cross-platform IL code manipulation library for runtime instrumentation of.net applications
Cross-platform IL code manipulation library for runtime instrumentation of.net applications master thesis subject for Markus Gaisbauer (0256634) in cooperation with dynatrace software GmbH July 5, 2007
Programación de Sistemas Empotrados y Móviles (PSEM)
Introduction to Windows Embedded Programación de Sistemas Empotrados y Móviles (PSEM) Marco A. Peña [email protected] Table of contents Windows XP Embedded vs. Windows CE Windows XP Embedded Windows CE
DEVELOPMENT OF A WORKFLOW APPLICATION FOR VEHICLE FLEET MANAGEMENT: A CASE STUDY OF GUINNESS NIGERIA PLC
DEVELOPMENT OF A WORKFLOW APPLICATION FOR VEHICLE FLEET MANAGEMENT: A CASE STUDY OF GUINNESS NIGERIA PLC 1,* John B. Oladosu, 2 Oludare Opaleye & 3 Olusayo D. Fenwa Computer Science and Engineering Department,
Soft PLC Research And Development System Based On PC ZHOU Wenjun 1, a
Research And Development System Based On PC ZHOU Wenjun 1, a 1 Nanning College for Vocational Technology, Nanning, 530008, Guangxi, China a [email protected] Keywords: Research; PC; Development Abstract.
Programming with the Microsoft.NET Framework Using Microsoft Visual Studio 2005 (VB)
Programming with the Microsoft.NET Framework Using Microsoft Visual Studio 2005 (VB) Course Number: 4995 Length: 5 Day(s) Certification Exam There are no exams associated with this course. Course Overview
Terms and Definitions for CMS Administrators, Architects, and Developers
Sitecore CMS 6 Glossary Rev. 081028 Sitecore CMS 6 Glossary Terms and Definitions for CMS Administrators, Architects, and Developers Table of Contents Chapter 1 Introduction... 3 1.1 Glossary... 4 Page
C#5.0 IN A NUTSHELL. Joseph O'REILLY. Albahari and Ben Albahari. Fifth Edition. Tokyo. Sebastopol. Beijing. Cambridge. Koln.
Koln C#5.0 IN A NUTSHELL Fifth Edition Joseph Albahari and Ben Albahari O'REILLY Beijing Cambridge Farnham Sebastopol Tokyo Table of Contents Preface xi 1. Introducing C# and the.net Framework 1 Object
How do Users and Processes interact with the Operating System? Services for Processes. OS Structure with Services. Services for the OS Itself
How do Users and Processes interact with the Operating System? Users interact indirectly through a collection of system programs that make up the operating system interface. The interface could be: A GUI,
IBM WebSphere ILOG Rules for.net
Automate business decisions and accelerate time-to-market IBM WebSphere ILOG Rules for.net Business rule management for Microsoft.NET and SOA environments Highlights Complete BRMS for.net Integration with
http://msdn.microsoft.com/en-us/library/4w3ex9c2.aspx
ASP.NET Overview.NET Framework 4 ASP.NET is a unified Web development model that includes the services necessary for you to build enterprise-class Web applications with a minimum of coding. ASP.NET is
SkyRecon Cryptographic Module (SCM)
SkyRecon Cryptographic Module (SCM) FIPS 140-2 Documentation: Security Policy Abstract This document specifies the security policy for the SkyRecon Cryptographic Module (SCM) as described in FIPS PUB 140-2.
JavaScript Patterns. Stoyan Stefanov. O'REILLY' Beijing Cambridge Farnham Koln Sebastopol Tokyo
JavaScript Patterns Stoyan Stefanov O'REILLY' Beijing Cambridge Farnham Koln Sebastopol Tokyo Table of Contents Preface xi 1. Introduction 1 Patterns 1 JavaScript: Concepts 3 Object-Oriented 3 No Classes
A standards-based approach to application integration
A standards-based approach to application integration An introduction to IBM s WebSphere ESB product Jim MacNair Senior Consulting IT Specialist [email protected] Copyright IBM Corporation 2005. All rights
Secure Network Communications FIPS 140 2 Non Proprietary Security Policy
Secure Network Communications FIPS 140 2 Non Proprietary Security Policy 21 June 2010 Table of Contents Introduction Module Specification Ports and Interfaces Approved Algorithms Test Environment Roles
1 What Are Web Services?
Oracle Fusion Middleware Introducing Web Services 11g Release 1 (11.1.1.6) E14294-06 November 2011 This document provides an overview of Web services in Oracle Fusion Middleware 11g. Sections include:
Mobile Operating Systems Lesson 05 Windows CE Part 1
Mobile Operating Systems Lesson 05 Windows CE Part 1 Oxford University Press 2007. All rights reserved. 1 Windows CE A 32 bit OS from Microsoft Customized for each specific hardware and processor in order
Table of Contents. Pocket Label Gallery White Paper
Mobile Label Printing with Pocket Label Gallery White Paper Bar code and RFID smart labeling software for Windows CE Mobile Devices Version 20150202 2012 SATO CORPORATION. All rights reserved. http://www.satoworldwide.com
1 What Are Web Services?
Oracle Fusion Middleware Introducing Web Services 11g Release 1 (11.1.1) E14294-04 January 2011 This document provides an overview of Web services in Oracle Fusion Middleware 11g. Sections include: What
Skynax. Mobility Management System. System Manual
Skynax Mobility Management System System Manual Intermec by Honeywell 6001 36th Ave. W. Everett, WA 98203 U.S.A. www.intermec.com The information contained herein is provided solely for the purpose of
IBM Tivoli Monitoring V6.2.3, how to debug issues with Windows performance objects issues - overview and tools.
IBM Tivoli Monitoring V6.2.3, how to debug issues with Windows performance objects issues - overview and tools. Page 1 of 13 The module developer assumes that you understand basic IBM Tivoli Monitoring
Base One's Rich Client Architecture
Base One's Rich Client Architecture Base One provides a unique approach for developing Internet-enabled applications, combining both efficiency and ease of programming through its "Rich Client" architecture.
Analytic Modeling in Python
Analytic Modeling in Python Why Choose Python for Analytic Modeling A White Paper by Visual Numerics August 2009 www.vni.com Analytic Modeling in Python Why Choose Python for Analytic Modeling by Visual
Programming in C# with Microsoft Visual Studio 2010
Introducción a la Programación Web con C# en Visual Studio 2010 Curso: Introduction to Web development Programming in C# with Microsoft Visual Studio 2010 Introduction to Web Development with Microsoft
Lecture 1 Introduction to Android
These slides are by Dr. Jaerock Kwon at. The original URL is http://kettering.jrkwon.com/sites/default/files/2011-2/ce-491/lecture/alecture-01.pdf so please use that instead of pointing to this local copy
ANDROID PROGRAMMING - INTRODUCTION. Roberto Beraldi
ANDROID PROGRAMMING - INTRODUCTION Roberto Beraldi Introduction Android is built on top of more than 100 open projects, including linux kernel To increase security, each application runs with a distinct
Considerations for Mobile Application Development
Intermec Technologies Considerations for Mobile Application Development Developer Support, 2012 Intermec Technologies 1/3/2012 Table of Contents What is an AKU?... 3 Device OS / IVA (SSPB)... 3 Operating
UML-based Test Generation and Execution
UML-based Test Generation and Execution Jean Hartmann, Marlon Vieira, Herb Foster, Axel Ruder Siemens Corporate Research, Inc. 755 College Road East Princeton NJ 08540, USA [email protected] ABSTRACT
REALbasic versus Visual Basic
REALbasic versus Visual Basic By Jerry Lee Ford, Jr. November 2006 When is comes to the development of Windows applications, REALbasic s main competitor it Microsoft s Visual Basic programming language.
http://barcoderesource.com/pdf417barcode.shtml
2D Barcode Fonts http://barcoderesource.com/pdf417barcode.shtml Copyright (c) 2009-2013, ConnectCode All Rights Reserved. ConnectCode accepts no responsibility for any adverse affect that may result from
SQL Server 2005 Reporting Services (SSRS)
SQL Server 2005 Reporting Services (SSRS) Author: Alex Payne and Brian Welcker Published: May 2005 Summary: SQL Server 2005 Reporting Services is a key component of SQL Server 2005. Reporting Services
Application Development,.NET
Application Development,.NET Orsys, with 30 years of experience, is providing high quality, independant State of the Art seminars and hands-on courses corresponding to the needs of IT professionals. Orsys
Visual Studio 2008: Windows Presentation Foundation
Visual Studio 2008: Windows Presentation Foundation Course 6460A: Three days; Instructor-Led Introduction This three-day instructor-led course provides students with the knowledge and skills to build and
AXIS 211A Network Camera
PRODUCT REVIEW GUIDE TABLE OF CONTENTS 1 PRODUCT BRIEF... 3 2 REQUIREMENTS FOR TEST... 4 3 INSTALLATION... 5 3.1 Installing the AXIS 211A... 5 3.2 Set the IP address with AXIS IP Utility... 5 3.2.1 Automatic
Asset Track Getting Started Guide. An Introduction to Asset Track
Asset Track Getting Started Guide An Introduction to Asset Track Contents Introducing Asset Track... 3 Overview... 3 A Quick Start... 6 Quick Start Option 1... 6 Getting to Configuration... 7 Changing
SAP NetWeaver Portal Development Kits for.net and Java
SAP NetWeaver Portal Development Kits for.net and Java Applies To: SAP NetWeaver Portal, Portal Development Kit for.net, Portal Development Kit for Java Summary This article provides a comparative overview
Simple Powerful. Efficient! Inventory. Network Audit and Computer Inventory Within Minutes. DATA CONCEPT software. PC Hardware Inventory
PC Hardware Software audit and license management Network scan Simple Powerful Collected data processing Efficient! Network Audit and Computer Within Minutes Summary Synexsys (SXSi) is a simple and powerful
OPC COMMUNICATION IN REAL TIME
OPC COMMUNICATION IN REAL TIME M. Mrosko, L. Mrafko Slovak University of Technology, Faculty of Electrical Engineering and Information Technology Ilkovičova 3, 812 19 Bratislava, Slovak Republic Abstract
How To Develop A Web Development Software For A Business
Company Profile Rg. No. GUJ-BVN-13673 0 Introduce with company OmTechSoft is an established high-potential player with a rich experience in developing customized commercial grade products and applications
Data Mining Governance for Service Oriented Architecture
Data Mining Governance for Service Oriented Architecture Ali Beklen Software Group IBM Turkey Istanbul, TURKEY [email protected] Turgay Tugay Bilgin Dept. of Computer Engineering Maltepe University Istanbul,
JMulTi/JStatCom - A Data Analysis Toolkit for End-users and Developers
JMulTi/JStatCom - A Data Analysis Toolkit for End-users and Developers Technology White Paper JStatCom Engineering, www.jstatcom.com by Markus Krätzig, June 4, 2007 Abstract JStatCom is a software framework
Off-the-shelf Packaged Software Systems And Custom Software Analysis By Gamal Balady MASS Group, Inc.
Off-the-shelf Packaged Software Systems And Custom Software Analysis By Gamal Balady MASS Group, Inc. April 1, 2004 1 Presentation Overview I. Packaged Software Systems vs. Custom Software Systems II.
Integrating SharePoint Sites within WebSphere Portal
Integrating SharePoint Sites within WebSphere Portal November 2007 Contents Executive Summary 2 Proliferation of SharePoint Sites 2 Silos of Information 2 Security and Compliance 3 Overview: Mainsoft SharePoint
Smartphone Spying Tools Mylonas Alexios
Smartphone Spying Tools Mylonas Alexios Student Number: 100588864 Supervisor: Keith Martin Submitted as part of the requirements for the award of the MSc in Information Security at Royal Holloway, University
Registry Tuner. Software Manual
Registry Tuner Software Manual Table of Contents Introduction 1 System Requirements 2 Frequently Asked Questions 3 Using the Lavasoft Registry Tuner 5 Scan and Fix Registry Errors 7 Optimize Registry
The best way to get Microsoft Visual Studio 2005 is by purchasing or renewing an MSDN Subscription today.
The best way to get Microsoft Visual Studio 2005 is by purchasing or renewing an MSDN Subscription today. Why Visual Studio 2005 represents one of the most significant developer tools releases since the
ADDENDUM - Bluetooth interface Option Instructions for using Extech Printer with a Bluetooth device
Introduction ADDENDUM - Bluetooth interface Option Instructions for using Extech Printer with a Bluetooth device Extech 3500T and 2500T thermal printers support full range of communication interfaces,
Understanding In and Out of XAML in WPF
Understanding In and Out of XAML in WPF 1. What is XAML? Extensible Application Markup Language and pronounced zammel is a markup language used to instantiate.net objects. Although XAML is a technology
SharePoint Server 2016. Quick Start Guide for Single Server Farms
1 SharePoint Server 2016 Quick Start Guide for Single Server Farms 2016 Microsoft Corporation. All rights reserved. This document is provided as-is. Information and views expressed in this document, including
