You are on page 1of 131

When was .NET announced?

Bill Gates delivered a keynote at Forum 2000, held June 22, 2000, outlining the .NET 'vision'. The July 2000 PDC had a number of sessions on .NET technology, and delegates were given CDs containing a pre-release version of the .NET framework/SDK and Visual Studio.NET. What are the Main Features of .NET platform? Features of .NET Platform are :Common Language Runtime Explains the features and benefits of the common language runtime, a run-time environment that manages the execution of code and provides services that simplify the development process. Assemblies Defines the concept of assemblies, which are collections of types and resources that form logical units of functionality. Assemblies are the fundamental units of deployment, version control, reuse, activation scoping, and security permissions. Application Domains Explains how to use application domains to provide isolation between applications. Runtime Hosts Describes the runtime hosts supported by the .NET Framework, including ASP.NET, Internet Explorer, and shell executables. Common Type System Identifies the types supported by the common language runtime. Metadata and Self-Describing Components Explains how the .NET Framework simplifies component interoperation by allowing compilers to emit additional declarative information, or metadata, into all modules and assemblies. Cross-Language Interoperability Explains how managed objects created in different programming languages can interact with one another. .NET Framework Security Describes mechanisms for protecting resources and code from unauthorized code and unauthorized users. .NET Framework Class Library Introduces the library of types provided by the .NET Framework, which expedites and optimizes the development process and gives you access to system functionality.

What is the difference between an EXE and a DLL? You can create an objects of Dll but not of the EXE. Dll is an In-Process Component whereas EXE is an OUt-Process Component. Exe is for single use whereas you can use Dll for multiple use. Exe can be started as standalone where dll cannot be. What is namespaces? Namespace is a logical naming scheme for group related types.Some class types that logically belong together they can be put into a common namespace. They prevent namespace collisions and they provide scoping. They are imported as "using" in C# or "Imports" in Visual Basic. It seems as if these directives specify a particular assembly, but they don't. A namespace can span multiple assemblies, and an assembly can define multiple namespaces. When the compiler needs the definition for a class type, it tracks through each of the different imported namespaces to the type name and searches each referenced assembly until it is found. Namespaces can be nested. This is very similar to packages in Java as far as scoping is concerned. What is the use of JIT ? JIT (Just - In - Time) is a compiler which converts MSIL code to Native Code (ie.. CPUspecific code that runs on the same computer architecture). Because the common language runtime supplies a JIT compiler for each supported CPU architecture, developers can write a set of MSIL that can be JIT-compiled and run on computers with different architectures. However, your managed code will run only on a specific operating system if it calls platform-specific native APIs, or a platform-specific class library. JIT compilation takes into account the fact that some code might never get called during execution. Rather than using time and memory to convert all the MSIL in a portable executable (PE) file to native code, it converts the MSIL as needed during execution and stores the resulting native code so that it is accessible for subsequent calls. The loader creates and attaches a stub to each of a type's methods when the type is loaded. On the initial call to the method, the stub passes control to the JIT compiler, which converts the MSIL for that method into native code and modifies the stub to direct execution to the location of the native code. Subsequent calls of the JIT-compiled method proceed directly to the native code that was previously generated, reducing the time it takes to JITcompile and run the code. What meant of assembly & global assembly cache (gac) & Meta data. Assembly :-- An assembly is the primary building block of a .NET based application. It is a collection of functionality that is built, versioned, and deployed as a single implementation unit (as one or more files). All managed types and resources are marked either as accessible only within their implementation unit, or as accessible by code outside that unit. It overcomes the problem of 'dll Hell'.The .NET Framework uses assemblies as the fundamental unit for several purposes: 1.Security 2.Type Identity

3.Reference Scope 4.Versioning 5.Deployment Global Assembly Cache :-- Assemblies can be shared among multiple applications on the machine by registering them in global Assembly cache(GAC). GAC is a machine wide a local cache of assemblies maintained by the .NET Framework. We can register the assembly to global assembly cache by using gacutil command. We can Navigate to the GAC directory, C:\winnt\Assembly in explore. In the tools menu select the cache properties; in the windows displayed you can set the memory limit in MB used by the GAC MetaData :--Assemblies have Manifests. This Manifest contains Metadata information of the Module/Assembly as well as it contains detailed Metadata of other assemblies/modules references (exported). It's the Assembly Manifest which differentiates between an Assembly and a Module. What is manifest? It is the metadata that describes the assemblies. What is metadata? Metadata is machine-readable information about a resource, or ""data about data."" Such information might include details on content, format, size, or other characteristics of a datasource. In .NET, metadata includes type definitions, version information, external assembly references, and other standardized information. What are the types of assemblies? There are four types of assemblies in .NET: Static assemblies These are the .NET PE files that you create at compile time. Dynamic assemblies These are PE-formatted, in-memory assemblies that you dynamically create at runtime using the classes in the System.Reflection.Emit namespace. Private assemblies These are static assemblies used by a specific application. Public or shared assemblies These are static assemblies that must have a unique shared name and can be used by any application. An application uses a private assembly by referring to the assembly using a static path or through an XML-based application configuration file. While the CLR doesn't enforce versioning policies-checking whether the correct version is used-for private assemblies, it ensures that an application uses the correct shared assemblies with which the application was built. Thus, an application uses a specific shared assembly by referring to the specific shared assembly, and the CLR ensures that the correct version is loaded at runtime.

In .NET, an assembly is the smallest unit to which you can associate a version number; What platforms does the .NET Framework run on? The runtime supports Windows XP, Windows 2000, NT4 SP6a and Windows ME/98. Windows 95 is not supported. Some parts of the framework do not work on all platforms - for example, ASP.NET is only supported on Windows XP and Windows 2000. Windows 98/ME cannot be used for development. IIS is not supported on Windows XP Home Edition, and so cannot be used to host ASP.NET. However, the ASP.NET Web Matrix web server does run on XP Home. The Mono project is attempting to implement the .NET framework on Linux. What is the CLR? CLR = Common Language Runtime. The CLR is a set of standard resources that (in theory) any .NET program can take advantage of, regardless of programming language. Robert Schmidt (Microsoft) lists the following CLR resources in his MSDN PDC# article: Object-oriented programming model (inheritance, polymorphism, exception handling, garbage collection) Security model Type system All .NET base classes Many .NET framework classes Development, debugging, and profiling tools Execution and code management IL-to-native translators and optimizers What this means is that in the .NET world, different programming languages will be more equal in capability than they have ever been before, although clearly not all languages will support all CLR services. What is the CTS? CTS = Common Type System. This is the range of types that the .NET runtime understands, and therefore that .NET applications can use. However note that not all .NET languages will support all the types in the CTS. The CTS is a superset of the CLS. What is the CLS? CLS = Common Language Specification. This is a subset of the CTS which all .NET languages are expected to support. The idea is that any program, which uses CLScompliant types, can interoperate with any .NET program written in any language. In theory this allows very tight interop between different .NET languages - for example allowing a C# class to inherit from a VB class. What is IL? IL = Intermediate Language. Also known as MSIL (Microsoft Intermediate Language) or

CIL (Common Intermediate Language). All .NET source code (of any language) is compiled to IL. The IL is then converted to machine code at the point where the software is installed, or at run-time by a Just-In-Time (JIT) compiler. What does 'managed' mean in the .NET context? The term 'managed' is the cause of much confusion. It is used in various places within .NET, meaning slightly different things.Managed code: The .NET framework provides several core run-time services to the programs that run within it - for example exception handling and security. For these services to work, the code must provide a minimum level of information to the runtime. Such code is called managed code. All C# and Visual Basic.NET code is managed by default. VS7 C++ code is not managed by default, but the compiler can produce managed code by specifying a command-line switch (/com+). Managed data: This is data that is allocated and de-allocated by the .NET runtime's garbage collector. C# and VB.NET data is always managed. VS7 C++ data is unmanaged by default, even when using the /com+ switch, but it can be marked as managed using the __gc keyword.Managed classes: This is usually referred to in the context of Managed Extensions (ME) for C++. When using ME C++, a class can be marked with the __gc keyword. As the name suggests, this means that the memory for instances of the class is managed by the garbage collector, but it also means more than that. The class becomes a fully paid-up member of the .NET community with the benefits and restrictions that brings. An example of a benefit is proper interop with classes written in other languages for example, a managed C++ class can inherit from a VB class. An example of a restriction is that a managed class can only inherit from one base class. What is the GAC? What problem does it solve? Each computer where the common language runtime is installed has a machine-wide code cache called the global assembly cache. The global assembly cache stores assemblies that are to be shared by several applications on the computer. This area is typically the folder under windows or winnt in the machine. All the assemblies that need to be shared across applications need to be done through the Global assembly Cache only. However it is not necessary to install assemblies into the global assembly cache to make them accessible to COM interop or unmanaged code. There are several ways to deploy an assembly into the global assembly cache: 1. Use an installer designed to work with the global assembly cache. This is the preferred option for installing assemblies into the global assembly cache. 2. Use a developer tool called the Global Assembly Cache tool (Gacutil.exe), provided by the .NET Framework SDK. 3. Use Windows Explorer to drag assemblies into the cache. GAC solves the problem of DLL Hell and DLL versioning. Unlike earlier situations, GAC can hold two assemblies of the same name but different version. This ensures that the applications which access a particular assembly continue to access the same assembly even if another version of that assembly is installed on that machine. What is reflection?

All .NET compilers produce metadata about the types defined in the modules they produce. This metadata is packaged along with the module (modules in turn are packaged together in assemblies), and can be accessed by a mechanism called reflection. The System.Reflection namespace contains classes that can be used to interrogate the types for a module/assembly. Using reflection to access .NET metadata is very similar to using ITypeLib/ITypeInfo to access type library data in COM, and it is used for similar purposes - e.g. determining data type sizes for marshaling data across context/process/machine boundaries. Reflection can also be used to dynamically invoke methods (see System.Type.InvokeMember ) , or even create types dynamically at run-time (see System.Reflection.Emit.TypeBuilder). What is side-by-side execution? Can two application one using private assembly and other using Shared assembly be stated as a side-by-side executables? Side-by-side execution is the ability to run multiple versions of an application or component on the same computer. You can have multiple versions of the common language runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time. Since versioning is only applied to shared assemblies, and not to private assemblies, two application one using private assembly and one using shared assembly cannot be stated as side-by-side executables. Why string are called Immutable data Type ? The memory representation of string is an Array of Characters, So on re-assigning the new array of Char is formed & the start address is changed . Thus keeping the Old string in Memory for Garbage Collector to be disposed. How do assemblies find each other? By searching directory paths. There are several factors which can affect the path (such as the AppDomain host, and application configuration files), but for private assemblies the search path is normally the application's directory and its sub-directories. For shared assemblies, the search path is normally same as the private assembly path plus the shared assembly cache. How does assembly versioning work? Each assembly has a version number called the compatibility version. Also each reference to an assembly (from another assembly) includes both the name and version of the referenced assembly.The version number has four numeric parts (e.g. 5.5.2.33). Assemblies with either of the first two parts different are normally viewed as incompatible. If the first two parts are the same, but the third is different, the assemblies are deemed as 'maybe compatible'. If only the fourth part is different, the assemblies are deemed compatible. However, this is just the default guideline - it is the version policy that decides to what extent these rules are enforced. The version policy can be specified via the application configuration file.

What is garbage collection? Garbage collection is a system whereby a run-time component takes responsibility for managing the lifetime of objects and the heap memory that they occupy. This concept is not new to .NET - Java and many other languages/runtimes have used garbage collection for some time. What is the difference between Finalize and Dispose (Garbage collection) ? Class instances often encapsulate control over resources that are not managed by the runtime, such as window handles (HWND), database connections, and so on. Therefore, you should provide both an explicit and an implicit way to free those resources. Provide implicit control by implementing the protected Finalize Method on an object (destructor syntax in C# and the Managed Extensions for C++). The garbage collector calls this method at some point after there are no longer any valid references to the object. In some cases, you might want to provide programmers using an object with the ability to explicitly release these external resources before the garbage collector frees the object. If an external resource is scarce or expensive, better performance can be achieved if the programmer explicitly releases resources when they are no longer being used. To provide explicit control, implement the Dispose method provided by the IDisposable Interface. The consumer of the object should call this method when it is done using the object. Dispose can be called even if other references to the object are alive. Note that even when you provide explicit control by way of Dispose, you should provide implicit cleanup using the Finalize method. Finalize provides a backup to prevent resources from permanently leaking if the programmer fails to call Dispose. What is GC (Garbage Collection) and how it works One of the good features of the CLR is Garbage Collection, which runs in the background collecting unused object references, freeing us from having to ensure we always destroy them. In reality the time difference between you releasing the object instance and it being garbage collected is likely to be very small, since the GC is always running. [The process of transitively tracing through all pointers to actively used objects in order to locate all objects that can be referenced, and then arranging to reuse any heap memory that was not found during this trace. The common language runtime garbage collector also compacts the memory that is in use to reduce the working space needed for the heap.] Heap: A portion of memory reserved for a program to use for the temporary storage of data structures whose existence or size cannot be determined until the program is running. Why doesn't the .NET runtime offer deterministic destruction? Because of the garbage collection algorithm. The .NET garbage collector works by periodically running through a list of all the objects that are currently being referenced by an application. All the objects that it doesn't find during this search are ready to be

destroyed and the memory reclaimed. The implication of this algorithm is that the runtime doesn't get notified immediately when the final reference on an object goes away - it only finds out during the next sweep of the heap. Futhermore, this type of algorithm works best by performing the garbage collection sweep as rarely as possible. Normally heap exhaustion is the trigger for a collection sweep. Is the lack of deterministic destruction in .NET a problem? It's certainly an issue that affects component design. If you have objects that maintain expensive or scarce resources (e.g. database locks), you need to provide some way for the client to tell the object to release the resource when it is done. Microsoft recommend that you provide a method called Dispose() for this purpose. However, this causes problems for distributed objects - in a distributed system who calls the Dispose() method? Some form of reference-counting or ownership-management mechanism is needed to handle distributed objects - unfortunately the runtime offers no help with this. What's the difference between Java and .NET garbage collectors? Sun left the implementation of a specific garbage collector up to the JRE developer, so their performance varies widely, depending on whose JRE you're using. Microsoft standardized on their garbage collection. How do you enforce garbage collection in .NET? System.GC.Collect(); How does the generational garbage collector in the .NET CLR manage object lifetime? What is non-deterministic finalization? The hugely simplistic version is that every time it garbage-collects, it starts by assuming everything to be garbage, then goes through and builds a list of everything reachable. Those become not-garbage, everything else doesn't, and gets thrown away. What makes it generational is that every time an object goes through this process and survives, it is noted as being a member of an older generation (up to 2, right now). When the garbagecollector is trying to free memory, it starts with the lowest generation (0) and only works up to higher ones if it can't free up enough space, on the grounds that shorter-lived objects are more likely to have been freed than longer-lived ones. Non-deterministic finalization implies that the destructor (if any) of an object will not necessarily be run (nor its memory cleaned up, but that's a relatively minor issue) immediately upon its going out of scope. Instead, it will wait until first the garbage collector gets around to finding it, and then the finalisation queue empties down to it; and if the process ends before this happens, it may not be finalised at all. (Although the operating system will usually clean up any process-external resources left open - note the usually there, especially as the exceptions tend to hurt a lot.) What is the difference between Finalize() and Dispose()? Dispose() is called by the user of an object to indicate that he is finished with it, enabling that object to release any unmanaged resources it holds. Finalize() is called by the run-

time to allow an object which has not had Dispose() called on it to do the same. However, Dispose() operates determinalistically, whereas there is no guarantee that Finalize() will be called immediately when an object goes out of scope - or indeed at all, if the program ends before that object is GCed - and as such Dispose() is generally preferred. How is the using() pattern useful? What is IDisposable? How does it support deterministic finalization? The using() pattern is useful because it ensures that Dispose() will always be called when a disposable object (defined as one that implements IDisposable, and thus the Dispose() method) goes out of scope, even if it does so by an exception being thrown, and thus that resources are always released. What is serialization? Serialization is the process of converting an object into a stream of bytes. Deserialization is the opposite process of creating an object from a stream of bytes. Serialization / Deserialization is mostly used to transport objects (e.g. during remoting), or to persist objects (e.g. to a file or database). Does the .NET Framework have in-built support for serialization? There are two separate mechanisms provided by the .NET class library - XmlSerializer and SoapFormatter/BinaryFormatter. Microsoft uses XmlSerializer for Web Services, and uses SoapFormatter/BinaryFormatter for remoting. Both are available for use in your own code. Can I customise the serialization process? Yes. XmlSerializer supports a range of attributes that can be used to configure serialization for a particular class. For example, a field or property can be marked with the [XmlIgnore] attribute to exclude it from serialization. Another example is the [XmlElement] attribute, which can be used to specify the XML element name to be used for a particular property or field. Serialization via SoapFormatter/BinaryFormatter can also be controlled to some extent by attributes. For example, the [NonSerialized] attribute is the equivalent of XmlSerializer's [XmlIgnore] attribute. Ultimate control of the serialization process can be acheived by implementing the the ISerializable interface on the class whose instances are to be serialized. Why is XmlSerializer so slow? There is a once-per-process-per-type overhead with XmlSerializer. So the first time you serialize or deserialize an object of a given type in an application, there is a significant delay. This normally doesn't matter, but it may mean, for example, that XmlSerializer is a poor choice for loading configuration settings during startup of a GUI application. Why do I get errors when I try to serialize a Hashtable? XmlSerializer will refuse to serialize instances of any class that implements IDictionary, e.g. Hashtable. SoapFormatter and BinaryFormatter do not have this restriction.

What are attributes? There are at least two types of .NET attribute. The first type I will refer to as a metadata attribute - it allows some data to be attached to a class or method. This data becomes part of the metadata for the class, and (like other class metadata) can be accessed via reflection. The other type of attribute is a context attribute. Context attributes use a similar syntax to metadata attributes but they are fundamentally different. Context attributes provide an interception mechanism whereby instance activation and method calls can be pre- and/or post-processed. Can I look at the IL for an assembly? Yes. MS supply a tool called Ildasm which can be used to view the metadata and IL for an assembly. Can source code be reverse-engineered from IL? Yes, it is often relatively straightforward to regenerate high-level source (e.g. C#) from IL. How can I stop my code being reverse-engineered from IL? There is currently no simple way to stop code being reverse-engineered from IL. In future it is likely that IL obfuscation tools will become available, either from MS or from third parties. These tools work by 'optimising' the IL in such a way that reverse-engineering becomes much more difficult. Of course if you are writing web services then reverse-engineering is not a problem as clients do not have access to your IL. What are the contents of assembly? In general, a static assembly can consist of four elements: i) The assembly manifest, which contains assembly metadata. ii) Type metadata. iii) Microsoft intermediate language (MSIL) code that implements the types. iv) A set of resources. Differnce between Managed code and unmanaged code ? Managed Code: Code that runs under a "contract of cooperation" with the common language runtime. Managed code must supply the metadata necessary for the runtime to provide services such as memory management, cross-language integration, code access security, and automatic lifetime control of objects. All code based on Microsoft intermediate language (MSIL) executes as managed code. Un-Managed Code: Code that is created without regard for the conventions and requirements of the common language runtime. Unmanaged code executes in the common language runtime

environment with minimal services (for example, no garbage collection, limited debugging, and so on). What is MSIL, IL, CTS and, CLR ? MSIL: (Microsoft intermediate language) When compiling to managed code, the compiler translates your source code into Microsoft intermediate language (MSIL), which is a CPU-independent set of instructions that can be efficiently converted to native code. MSIL includes instructions for loading, storing, initializing, and calling methods on objects, as well as instructions for arithmetic and logical operations, control flow, direct memory access, exception handling, and other operations. Before code can be executed, MSIL must be converted to CPU-specific code, usually by a just-in-time (JIT) compiler. Because the common language runtime supplies one or more JIT compilers for each computer architecture it supports, the same set of MSIL can be JIT-compiled and executed on any supported architecture. When a compiler produces MSIL, it also produces metadata. Metadata describes the types in your code, including the definition of each type, the signatures of each type's members, the members that your code references, and other data that the runtime uses at execution time. The MSIL and metadata are contained in a portable executable (PE) file that is based on and extends the published Microsoft PE and Common Object File Format (COFF) used historically for executable content. This file format, which accommodates MSIL or native code as well as metadata, enables the operating system to recognize common language runtime images. The presence of metadata in the file along with the MSIL enables your code to describe itself, which means that there is no need for type libraries or Interface Definition Language (IDL). The runtime locates and extracts the metadata from the file as needed during execution. IL: (Intermediate Language) A language used as the output of a number of compilers and as the input to a just-in-time (JIT) compiler. The common language runtime includes a JIT compiler for converting MSIL to native code. CTS: (Common Type System) The specification that determines how the common language runtime defines, uses, and manages types CLR: (Common Language Runtime) The engine at the core of managed code execution. The runtime supplies managed code with services such as cross-language integration, code access security, object lifetime management, and debugging and profiling support. What is Reference type and value type ? Reference Type: Reference types are allocated on the managed CLR heap, just like object types. A data type that is stored as a reference to the value's location. The value of a reference type is the location of the sequence of bits that represent the type's data. Reference types can be self-describing types, pointer types, or interface types

Value Type: Value types are allocated on the stack just like primitive types in VBScript, VB6 and C/C++. Value types are not instantiated using new go out of scope when the function they are defined within returns. Value types in the CLR are defined as types that derive from system.valueType. A data type that fully describes a value by specifying the sequence of bits that constitutes the value's representation. Type information for a value type instance is not stored with the instance at run time, but it is available in metadata. Value type instances can be treated as objects using boxing. What is Boxing and unboxing ? Boxing: The conversion of a value type instance to an object, which implies that the instance will carry full type information at run time and will be allocated in the heap. The Microsoft intermediate language (MSIL) instruction set's box instruction converts a value type to an object by making a copy of the value type and embedding it in a newly allocated object. Un-Boxing: The conversion of an object instance to a value type. What is JIT and how is works ? An acronym for "just-in-time," a phrase that describes an action that is taken only when it becomes necessary, such as just-in-time compilation or just-in-time object activation What is strong name? A name that consists of an assembly's identityits simple text name, version number, and culture information (if provided)strengthened by a public key and a digital signature generated over the assembly. Because the assembly manifest contains file hashes for all the files that constitute the assembly implementation, it is sufficient to generate the digital signature over just the one file in the assembly that contains the assembly manifest. Assemblies with the same strong name are expected to be identical What is global assembly cache? A machine-wide code cache that stores assemblies specifically installed to be shared by many applications on the computer. Applications deployed in the global assembly cache must have a strong name. What is difference between constants, readonly and, static ? Constants: The value cant be changed Read-only: The value will be initialized only once from the constructor of the class. Static: Value can be initialized once. What is difference between shared and public? An assembly that can be referenced by more than one application. An assembly must be

explicitly built to be shared by giving it a cryptographically strong name. What is namespace used for loading assemblies at run time and name the methods? System.Reflection What are the types of authentication in .net? We have three types of authentication: 1. Form authentication 2. Windows authentication 3. Passport This has to be declared in web.config file. What is the difference between a Struct and a Class ? The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Although it is possible to represent a point as a class, a struct is more efficient in some scenarios. For example, if you declare an array of 1000 Point objects,you will allocate additional memory for referencing each object. In this case, the struct is less expensive. When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. If you do not use new, the fields will remain unassigned and the object cannot be used until all of the fields are initialized. It is an error to declare a default (parameterless) constructor for a struct. A default constructor is always provided to initialize the struct members to their default values. It is an error to initialize an instance field in a struct. There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do. A struct is a value type, while a class is a reference type. What is the difference between structures and enumeration?. Unlike classes, structs are value types and do not require heap allocation. A variable of a struct type directly contains the data of the struct, whereas a variable of a class type contains a reference to the data. They are derived from System.ValueType class. Enum->An enum type is a distinct type that declares a set of named constants.They are strongly typed constants. They are unique types that allow to declare symbolic names to integral values. Enums are value types, which means they contain their own value, can't inherit or be inherited from and assignment copies the value of one enum to another. public enum Grade { A, B, C }

What's a delegate? A delegate object encapsulates a reference to a method. In C++ they were referred to as function pointers. What's a multicast delegate? It's a delegate that points to and eventually fires off several methods. What are delegates?where are they used ? A delegate defines a reference type that can be used to encapsulate a method with a specific signature. A delegate instance encapsulates a static or an instance method. Delegates are roughly similar to function pointers in C++; however, delegates are typesafe and secure. When do you use virutal keyword?. When we need to override a method of the base class in the sub class, then we give the virtual keyword in the base class method. This makes the method in the base class to be overridable. Methods, properties, and indexers can be virtual, which means that their implementation can be overridden in derived classes. What are class access modifiers ? Access modifiers are keywords used to specify the declared accessibility of a member or a type. This section introduces the four access modifiers: Public - Access is not restricted. Protected - Access is limited to the containing class or types derived from the containing class. Internal - Access is limited to the current assembly. Protected inertnal - Access is limited to the current assembly or types derived from the containing class. Private - Access is limited to the containing type What's the implicit name of the parameter that gets passed into the class' set method? Value, and it's datatype depends on whatever variable we're changing. How do you inherit from a class in C#? Place a colon and then the name of the base class. Notice that it's double colon in C++. Does C# support multiple inheritance? No, use interfaces instead. When you inherit a protected class-level variable, who is it available to? Derived Classes. What's the top .NET class that everything is derived from?

System.Object. How's method overriding different from overloading? When overriding, you change the method behavior for a derived class. Overloading simply involves having a method with the same name within the class. What does the keyword virtual mean in the method definition? The method can be over-ridden. Can you declare the override method static while the original method is non-static? No, you can't, the signature of the virtual method must remain the same, and only the keyword virtual is changed to keyword override. Can you override private virtual methods? No, moreover, you cannot access private methods in inherited classes, have to be protected in the base class to allow any sort of access. Can you prevent your class from being inherited and becoming a base class for some other classes? Yes, that's what keyword sealed in the class definition is for. The developer trying to derive from your class will get a message: cannot inherit from Sealed class WhateverBaseClassName. It's the same concept as final class in Java. Can you allow class to be inherited, but prevent the method from being overridden? Yes, just leave the class public and make the method sealed. Why can't you specify the accessibility modifier for methods inside the interface? They all must be public. Therefore, to prevent you from getting the false impression that you have any freedom of choice, you are not allowed to specify any accessibility, it's public by default. Can you inherit multiple interfaces? And if they have conflicting method names? Yes, why not. It's up to you to implement the method inside your own class, so implementation is left entirely up to you. This might cause a problem on a higher-level scale if similarly named methods from different interfaces expect different data, but as far as compiler cares you're okay. What's the difference between an interface and abstract class? In the interface all methods must be abstract, in the abstract class some methods can be concrete. In the interface no accessibility modifiers are allowed, which is ok in abstract classes. Describe what an Interface is and how its different from a Class.

An interface is a structure of code which is similar to a class. An interface is a prototype for a class and is useful from a logical design perspective. Interfaces provide a means to define the protocols for a class without worrying about the implementation details. The syntax for creating interfaces follows: interface Identifier { InterfaceBody } Identifier is the name of the interface and InterfaceBody refers to the abstract methods and static final variables that make up the interface. Because it is assumed that all the methods in an interface are abstract, it isn't necessary to use the abstract keyword An interface is a description of some of the members available from a class. In practice, the syntax typically looks similar to a class definition, except that there's no code defined for the methods just their name, the arguments passed and the type of the value returned. So what good is it? None by itself. But you create an interface so that classes will implement it. But what does it mean to implement an interface. The interface acts as a contract or promise. If a class implements an interface, then it must have the properties and methods of the interface defined in the class. This is enforced by the compiler. Broadly the differentiators between classes and interfaces is as follows Interface should not have any implementation. Interface can not create any instance. Interface should provide high level abstraction from the implementation. Interface can have multiple inheritances. Default access level of the interface is public. How can you overload a method? By having Different parameter data types. By having different number of parameters. By having different order of parameters. What's an abstract class? Abstract class is a class that cannot be instantiated. An abstract class is a class that must be inherited and have the methods overridden. An abstract class is essentially a blueprint for a class without any implementation. When do you absolutely have to declare a class as abstract? 1. When at least one of the methods in the class is abstract. 2. When the class itself is inherited from an abstract class, but not all base abstract methods have been overridden. What's an interface?

It's an abstract class with public abstract methods all of which must be implemented in the inherited classes. Why can't you specify the accessibility modifier for methods inside the interface? They all must be public. Therefore, to prevent you from getting the false impression that you have any freedom of choice, you are not allowed to specify any accessibility, it's public by default. What's the difference between an interface and abstract class? In an interface class, all methods must be abstract. In an abstract class some methods can be concrete. In an interface class, no accessibility modifiers are allowed, which is ok in an abstract class. How is method overriding different from method overloading? When overriding a method, you change the behavior of the method for the derived class. Overloading a method simply involves having another method with the same name within the class. Can you declare an override method to be static if the original method is non-static? No. The signature of the virtual method must remain the same, only the keyword virtual is changed to keyword override. Can you override private virtual methods? No. Private methods are not accessible outside the class. Explain the use of virtual, sealed, override, and abstract. Abstract: The keyword can be applied for a class or method. 1. Class: If we use abstract keyword for a class it makes the class an abstract class, which means it cant be instantiated. Though it is not nessacary to make all the method within the abstract class to be virtual. ie, Abstract class can have concrete methods 2. Method: If we make a method as abstract, we dont need to provide implementation of the method in the class but the derived class need to implement/override this method. Sealed: It can be applied on a class and methods. It stops the type from further derivation i.e no one can derive class from a sealed class,ie A sealed class cannot be inherited.A sealed class cannot be a abstract class.A compile time error is thrown if you try to specify sealed class as a base class. When an instance method declaration includes a sealed modifier, that method is said to be a sealed method. If an instance method declaration includes the sealed modifier, it must also include the override modifier. Use of the sealed modifier prevents a derived class from further overriding the method For Egs: sealed override public void Sample() { Console.WriteLine("Sealed Method"); } Virtual & Override: Virtual & Override keywords provides runtime polymorphism. A base class can make some of its methods as virtual which allows the derived class a

chance to override the base class implementation by using override keyword. For e.g. class Shape { int a public virtual void Display() { Console.WriteLine("Shape"); } } class Rectangle:Shape { public override void Display() { Console.WriteLine("Derived"); } } Explain the differences between public, protected, private and internal. ? These all are access modifier and they governs the access level. They can be applied to class, methods, fields. Public: Allows class, methods, fields to be accessible from anywhere i.e. within and outside an assembly. Private: When applied to field and method allows to be accessible within a class. Protected: Similar to private but can be accessed by members of derived class also. Internal: They are public within the assembly i.e. they can be accessed by anyone within an assembly but outside assembly they are not visible.

Difference between Dispose and Finallize method? Finalize method is used to free the memory used by some unmanaged resources like window handles (HWND). It's similar to the destructor syntax in C#. The GC calls this method when it founds no more references to the object. But, In some cases we may need release the memory used by the resources explicitely.To release the memory explicitly we need to implement the Dispose method of IDisposable interface. What is encapsulation ? Encapsulation is the ability to hide the internal workings of an object's behavior and its data. For instance, let's say you have a object named Bike and this object has a method named start(). When you create an instance of a Bike object and call its start() method you are not worried about what happens to accomplish this, you just want to make sure the state of the bike is changed to 'running' afterwards. This kind of behavior hiding is

encapsulation and it makes programming much easier. How can you prevent your class to be inherated further? By setting Sealed - Key word public sealed class Planet { //code goes here } class Moon:Planet { //Not allowed as base class is sealed } How's the DLL Hell problem solved in .NET? Assembly versioning allows the application to specify not only the library it needs to run (which was available under Win32), but also the version of the assembly. How big is the datatype int in .NET? 32 bits. How big is the char? 16 bits (Unicode). What data type should you use if you want an 8-bit value that's signed? sbyte. Speaking of Boolean data types, what's different between C# and C/C++? There's no conversion between 0 and false, as well as any other number and true, like in C/C++. Where are the value-type variables allocated in the computer RAM? Stack. Where do the reference-type variables go in the RAM? The references go on the stack, while the objects themselves go on the heap. What is the difference between the value-type variables and reference-type variables in terms of garbage collection? The value-type variables are not garbage-collected, they just fall off the stack when they fall out of scope, GC picks up the reference-type objects when their references go null. How do you convert a string into an integer in .NET? Int32.Parse(string) How do you box a primitive data type variable? Assign it to the object, pass an object.

Why do you need to box a primitive variable? Pass it by reference. How do you initiate a string without escaping each backslash? Put an @ sign in front of the double-quoted string. What's the access level of the visibility type internal? Current application. Explain encapsulation? The implementation is hidden, the interface is exposed. What's different about namespace declaration when comparing that to package declaration in Java? No semicolon. What's the difference between const and readonly? You can initialize readonly variables to some runtime values. Let's say your program uses current date and time as one of the values that won't change. This way you declare public readonly string DateT = new DateTime().ToString(). What happens when you encounter a continue statement inside the for loop? The code for the rest of the loop is ignored, the control is transferred back to the beginning of the loop. What's the advantage of using System.Text.StringBuilder over System.String? StringBuilder is more efficient in the cases, where a lot of manipulation is done to the text. Strings are immutable, so each time it's being operated on, a new instance is created. Can you store multiple data types in System.Array? No. What's the difference between the System.Array.CopyTo() and System.Array.Clone()? The first one performs a deep copy of the array, the second one performs a shallow copy. (what is a deep and shallow copy?) How can you sort the elements of the array in descending order? By calling Sort() and then Reverse() methods. What's the .NET datatype that allows the retrieval of data by a unique key? HashTable.

What's class SortedList underneath? A sorted Hash Table. Will finally block get executed if the exception had not occurred? Yes. Can multiple catch blocks be executed? No, once the proper catch code fires off, the control is transferred to the finally block (if there are any), and then whatever follows the finally block. Why is it a bad idea to throw your own exceptions? Well, if at that point you know that an error has occurred, then why not write the proper code to handle that error instead of passing a new Exception object to the catch block? Throwing your own exceptions signifies some design flaws in the project. What are the ways to deploy an assembly? An MSI installer, a CAB archive, and XCOPY command. What are three test cases you should go through in unit testing? Positive test cases (correct data, correct output), negative test cases (broken or missing data, proper handling), exception test cases (exceptions are thrown and caught properly). Can you change the value of a variable while debugging a C# application? Yes, if you are debugging via Visual Studio.NET, just go to immediate window. If a base class has a bunch of overloaded constructors, and an inherited class has another bunch of overloaded constructors, can you enforce a call from an inherited constructor to an arbitrary base constructor? Yes, just place a colon, and then keyword base (parameter list to invoke the appropriate constructor) in the overloaded constructor definition inside the inherited class. What's the difference between System.String and System.StringBuilder classes? System.String is immutable, System.StringBuilder was designed with the purpose of having a mutable string where a variety of operations can be performed. Does C# support multiple-inheritance? No, use interfaces instead. When you inherit a protected class-level variable, who is it available to? The derived class. Are private class-level variables inherited? Yes, but they are not accessible. Although they are not visible or accessible via the class interface, they are inherited.

Describe the accessibility modifier "protected internal". It is available to derived classes and classes within the same Assembly (and naturally from the base class it's declared in). What's the top .NET class that everything is derived from? System.Object. What's the advantage of using System.Text.StringBuilder over System.String? StringBuilder is more efficient in cases where there is a large amount of string manipulation. Strings are immutable, so each time it's being operated on, a new instance is created. Can you store multiple data types in System.Array? No. What's the .NET class that allows the retrieval of a data element using a unique key? HashTable. Will the finally block get executed if an exception has not occurred? Yes. Can you write a class without specifying namespace? Which namespace does it belong to by default? Yes, you can, then the class belongs to global namespace which has no name. For commercial products, naturally, you wouldn't want global namespace. What is a formatter? A formatter is an object that is responsible for encoding and serializing data into messages on one end, and deserializing and decoding messages into data on the other end. What are the mobile devices supported by .net platform The Microsoft .NET Compact Framework is designed to run on mobile devices such as mobile phones, Personal Digital Assistants (PDAs), and embedded devices. The easiest way to develop and test a Smart Device Application is to use an emulator. These devices are divided into two main divisions: 1) Those that are directly supported by .NET (Pocket PCs, i-Mode phones, and WAP devices) 2) Those that are not (Palm OS and J2ME-powered devices). Describe the difference between inline and code behind - which is best in a loosely coupled solution

ASP.NET supports two modes of page development: Page logic code that is written inside runat="server"> blocks within an .aspx file and dynamically compiled the first time the page is requested on the server. Page logic code that is written within an external class that is compiled prior to deployment on a server and linked ""behind"" the .aspx file at run time. Whats MSIL, and why should my developers need an appreciation of it if at all? When compiling the source code to managed code, the compiler translates the source into Microsoft intermediate language (MSIL). This is a CPU-independent set of instructions that can efficiently be converted to native code. Microsoft intermediate language (MSIL) is a translation used as the output of a number of compilers. It is the input to a just-intime (JIT) compiler. The Common Language Runtime includes a JIT compiler for the conversion of MSIL to native code. Before Microsoft Intermediate Language (MSIL) can be executed it, must be converted by the .NET Framework just-in-time (JIT) compiler to native code. This is CPU-specific code that runs on the same computer architecture as the JIT compiler. Rather than using time and memory to convert all of the MSIL in a portable executable (PE) file to native code. It converts the MSIL as needed whilst executing, then caches the resulting native code so its accessible for any subsequent calls. How many .NET languages can a single .NET DLL contain? One What type of code (server or client) is found in a Code-Behind class? Server What is an assembly? Assemblies are the building blocks of .NET Framework applications; they form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions. An assembly is a collection of types and resources that are built to work together and form a logical unit of functionality. An assembly provides the common language runtime with the information it needs to be aware of type implementations. To the runtime, a type does not exist outside the context of an assembly. How many classes can a single .NET DLL contain? Unlimited. What is the difference between string and String ? No difference . What is Value type and refernce type in .Net?. Value Type : A variable of a value type always contains a value of that type. The assignment to a variable of a value type creates a copy of the assigned value, while the assignment to a variable of a reference type creates a copy of the reference but not of the referenced object.

The value types consist of two main categories: * Stuct Type * Enumeration Type Reference Type :Variables of reference types, referred to as objects, store references to the actual data. This section introduces the following keywords used to declare reference types: * Class * Interface * Delegate This section also introduces the following built-in reference types: * object * string How do you create shared assemblies? Just look through the definition of Assemblies.. * An Assembly is a logical unit of code * Assembly physically exist as DLLs or EXEs * One assembly can contain one or more files * The constituent files can include any file types like image files, text files etc. along with DLLs or EXEs * When you compile your source code by default the exe/dll generated is actually an assembly * Unless your code is bundled as assembly it can not be used in any other application * When you talk about version of a component you are actually talking about version of the assembly to which the component belongs. * Every assembly file contains information about itself. This information is called as Assembly Manifest. Following steps are involved in creating shared assemblies : * Create your DLL/EXE source code * Generate unique assembly name using SN utility * Sign your DLL/EXE with the private key by modifying AssemblyInfo file * Compile your DLL/EXE * Place the resultant DLL/EXE in global assembly cache using AL utility What is the property available to check if the page posted or not? The Page_Load event handler in the page checks for IsPostBack property value, to ascertain whether the page is posted. The Page.IsPostBack gets a value indicating whether the page is being loaded in response to the client postback, or it is for the first time. The value of Page.IsPostBack is True, if the page is being loaded in response to the client postback; while its value is False, when the page is loaded for the first time. The Page.IsPostBack property facilitates execution of certain routine in Page_Load, only once (for e.g. in Page load, we need to set default value in controls, when page is loaded for the first time. On post back, we check for true value for IsPostback value and then invoke server-side code to

update data). Why do you need to serialize.? We need to serialize the object,if you want to pass object from one computer/application domain to another.Process of converting complex objects into stream of bytes that can be persisted or transported.Namespace for serialization is System.Runtime.Serialization.The ISerializable interface allows you to make any class Serializable..NET framework features 2 serializing method. 1.Binary Serialization 2.XML Serialization Can a nested object be used in Serialization ? Yes. If a class that is to be serialized contains references to objects of other classes, and if those classes have been marked as serializable, then their objects are serialized too. Difference between int and int32 ? Both are same. System.Int32 is a .NET class. Int is an alias name for System.Int32. Describe the difference between a Thread and a Process? A Process is an instance of an running application. And a thread is the Execution stream of the Process. A process can have multiple Thread. When a process starts a specific memory area is allocated to it. When there is multiple thread in a process, each thread gets a memory for storing the variables in it and plus they can access to the global variables which is common for all the thread. Eg.A Microsoft Word is a Application. When you open a word file,an instance of the Word starts and a process is allocated to this instance which has one thread. Conceptually, what is the difference between early-binding and late-binding? Early binding Binding at Compile Time Late Binding Binding at Run Time Early binding implies that the class of the called object is known at compile-time; latebinding implies that the class is not known until run-time, such as a call through an interface or via Reflection. Early binding is the preferred method. It is the best performer because your application binds directly to the address of the function being called and there is no extra overhead in doing a run-time lookup. In terms of overall execution speed, it is at least twice as fast as late binding. Early binding also provides type safety. When you have a reference set to the component's type library, Visual Basic provides IntelliSense support to help you code each function correctly. Visual Basic also warns you if the data type of a parameter or return value is incorrect, saving a lot of time when writing and debugging code. Late binding is still useful in situations where the exact interface of an object is not known at design-time. If your application seeks to talk with multiple unknown servers or needs to invoke functions by name (using the Visual Basic 6.0 CallByName function for example) then you need to use late binding. Late binding is also useful to work around compatibility problems between multiple versions of a component that has improperly

modified or adapted its interface between versions. What is difference between MetaData and Manifest ? Metadata and Manifest forms an integral part of an assembly( dll / exe ) in .net framework . Out of which Metadata is a mandatory component , which as the name suggests gives the details about various components of IL code viz : Methods , properties , fields , class etc. Essentially Metadata maintains details in form of tables like Methods Metadata tables , Properties Metadata tables , which maintains the list of given type and other details like access specifier , return type etc. Now Manifest is a part of metadata only , fully called as manifest metadata tables , it contains the details of the references needed by the assembly of any other external assembly / type , it could be a custom assembly or standard System namespace . Now for an assembly that can independently exists and used in the .Net world both the things ( Metadata with Manifest ) are mandatory , so that it can be fully described assembly and can be ported anywhere without any system dependency . Essentially .Net framework can read all assembly related information from assembly itself at runtime . But for .Net modules , that cant be used independently , until they are being packaged as a part of an assembly , they dont contain Manifest but their complete structure is defined by their respective metadata . Ultimately .Net modules use Manifest Metadata tables of parent assembly which contain them. What actually happes when you add a something to arraylistcollection ? Following things will happen : Arraylist is a dynamic array class in c# in System.Collections namespace derived from interfaces ICollection , IList , ICloneable , IConvertible . It terms of in memory structure following is the implementation . a. Check up the total space if theres any free space on the declared list . b. If yes add the new item and increase count by 1 . c. If No Copy the whole thing to a temporary Array of Last Max. Size . d. Create new Array with size ( Last Array Size + Increase Value ) e. Copy back values from temp and reference this new array as original array . f. Must doing Method updates too , need to check it up . *********************************************************************** ********** ASP.NET Interview Questions 1.Describe the role of inetinfo.exe, aspnet_isapi.dll andaspnet_wp.exe in the page loading process. inetinfo.exe is theMicrosoft IIS server running, handling ASP.NET requests among other things.When an ASP.NET request is received (usually a file with .aspx extension), the ISAPI filter aspnet_isapi.dll takes care of it by passing the request tothe actual worker process aspnet_wp.exe.

2.Whats the difference between Response.Write() and Response.Output.Write()? Response.Output.Write() allows you to write formatted output. 3.What methods are fired during the page load? Init() - when the page is instantiated Load() - when the page is loaded into server memory PreRender() - the brief moment before the page is displayed to the user as HTML Unload() - when page finishes loading. 4.When during the page processing cycle is ViewState available? After the Init() and before the Page_Load(), or OnLoad() for a control. 5.What namespace does the Web page belong in the .NET Framework class hierarchy? System.Web.UI.Page 6.Where do you store the information about the users locale? System.Web.UI.Page.Culture 7.Whats the difference between Codebehind="MyCode.aspx.cs" andSrc="MyCode.aspx.cs"? CodeBehind is relevant to Visual Studio.NET only. 8.Whats a bubbled event? When you have a complex control, like DataGrid, writing an event processing routine for each object (cell, button, row, etc.) is quite tedious. The controls can bubble up their eventhandlers, allowing the main DataGrid event handler to take care of its constituents. 9.Suppose you want a certain ASP.NET function executed on MouseOver for a certain button. Where do you add an event handler? Add an OnMouseOver attribute to the button. Example: btnSubmit.Attributes.Add("onmouseover","someClientCodeHere();"); 10.What data types do the RangeValidator control support? Integer, String, and Date. 11.Explain the differences between Server-side and Client-side code? Server-side code executes on the server. Client-side code executes in the client's browser. 12.What type of code (server or client) is found in a Code-Behind class? The answer is server-side code since code-behind is executed on the server. However, during the code-behind's execution on the server, it can render client-side code such as JavaScript to be processed in the clients browser. But just to be clear, code-behind executes on the server, thus making it server-side code.

13.Should user input data validation occur server-side or client-side? Why? All user input data validation should occur on the server at a minimum. Additionally, client-side validation can be performed where deemed appropriate and feasable to provide a richer, more responsive experience for the user. 14.What is the difference between Server.Transfer and Response.Redirect? Why would I choose one over the other? Server.Transfer transfers page processing from one page directly to the next page without making a round-trip back to the client's browser. This provides a faster response with a little less overhead on the server. Server.Transfer does not update the clients url history list or current url. Response.Redirect is used to redirect the user's browser to another page or site. This performas a trip back to the client where the client's browser is redirected to the new page. The user's browser history list is updated to reflect the new address. 15.Can you explain the difference between an ADO.NET Dataset and an ADO Recordset? Valid answers are: A DataSet can represent an entire relational database in memory, complete with tables, relations, and views. A DataSet is designed to work without any continuing connection to the original data source. Data in a DataSet is bulk-loaded, rather than being loaded on demand. There's no concept of cursor types in a DataSet. DataSets have no current record pointer You can use For Each loops to move through the data. You can store many edits in a DataSet, and write them to the original data source in a single operation. Though the DataSet is universal, other objects in ADO.NET come in different versions for different data sources. 16.What is the Global.asax used for? The Global.asax (including the Global.asax.cs file) is used to implement application and session level events. 17.What are the Application_Start and Session_Start subroutines used for? This is where you can set the specific variables for the Application and Session objects. 18.Can you explain what inheritance is and an example of when you might use it? When you want to inherit (use the functionality of) another class. Example: With a base class named Employee, a Manager class could be derived from the Employee base class. 19.Whats an assembly? Assemblies are the building blocks of the .NET framework. Overview of assemblies from MSDN

20.Describe the difference between inline and code behind. Inline code written along side the html in a page. Code-behind is code written in a separate file and referenced by the .aspx page. 21.Explain what a diffgram is, and a good use for one? The DiffGram is one of the two XML formats that you can use to render DataSet object contents to XML. A good use is reading database data to an XML file to be sent to a Web Service. 22.Whats MSIL, and why should my developers need an appreciation of it if at all? MSIL is the Microsoft Intermediate Language. All .NET compatible languages will get converted to MSIL. MSIL also allows the .NET Framework to JIT compile the assembly on the installed computer. 23.Which method do you invoke on the DataAdapter control to load your generated dataset with data? The Fill() method. 24.Can you edit data in the Repeater control? No, it just reads the information from its data source. 25.Which template must you provide, in order to display data in a Repeater control? ItemTemplate. 26.How can you provide an alternating color scheme in a Repeater control? Use the AlternatingItemTemplate. 27.What property must you set, and what method must you call in your code, in order to bind the data from a data source to the Repeater control? You must set the DataSource property and call the DataBind method. 28.What base class do all Web Forms inherit from? The Page class. 29.Name two properties common in every validation control? ControlToValidate property and Text property. 30.Which property on a Combo Box do you set with a column name, prior to setting the DataSource, to display data in the combo box? DataTextField property. 31.Which control would you use if you needed to make sure the values in two different controls matched? CompareValidator control.

32.How many classes can a single .NET DLL contain? It can contain many classes. *********************************************************************** ************** ADO.NET and Database Questions 1.What is the role of the DataReader class in ADO.NET connections? It returns a read-only, forward-only rowset from the data source. A DataReader provides fast access when a forward-only sequential read is needed. 2.What are advantages and disadvantages of Microsoft-provided data provider classes in ADO.NET? SQLServer.NET data provider is high-speed and robust, but requires SQL Server license purchased from Microsoft. OLE-DB.NET is universal for accessing other sources, like Oracle, DB2, Microsoft Access and Informix. OLE-DB.NET is a .NET layer on top of the OLE layer, so its not as fastest and efficient as SqlServer.NET. 3.What is the wildcard character in SQL? Lets say you want to query database with LIKE for all employees whose name starts with La. The wildcard character is %, the proper query with LIKE would involve La%. 4.Explain ACID rule of thumb for transactions. A transaction must be: 1. Atomic - it is one unit of work and does not dependent on previous and following transactions. 2. Consistent - data is either committed or roll back, no in-between case where something has been updated and something hasnt. 3. Isolated - no transaction sees the intermediate results of the current transaction). 4. Durable - the values persist if the data had been committed even if the system crashes right after. 5.What connections does Microsoft SQL Server support? Windows Authentication (via Active Directory) and SQL Server authentication (via Microsoft SQL Server username and password). 6.Between Windows Authentication and SQL Server Authentication, which one is trusted and which one is untrusted? Windows Authentication is trusted because the username and password are checked with the Active Directory, the SQL Server authentication is untrusted, since SQL Server is the only verifier participating in the transaction. 7.What does the Initial Catalog parameter define in the connection string? The database name to connect to.

8.What does the Dispose method do with the connection object? Deletes it from the memory. 9.What is a pre-requisite for connection pooling? Multiple processes must agree that they will share the same connection, where every parameter is the same, including the security settings. The connection string must be identical. *********************************************************************** ********** Web Service Questions 1.What is the transport protocol you use to call a Web service? SOAP (Simple Object Access Protocol) is the preferred protocol. 2.True or False: A Web service can only be written in .NET? False 3.What does WSDL stand for? Web Services Description Language. 4.Where on the Internet would you look for Web services? http://www.uddi.org 5.True or False: To test a Web service you must create a Windows application or Web application to consume this service? False, the web service comes with a test page and it provides HTTP-GET method to test. *********************************************************************** ************* State Management Questions 1.What is ViewState? ViewState allows the state of objects (serializable) to be stored in a hidden field on the page. ViewState is transported to the client and back to the server, and is not stored on the server or any other external source. ViewState is used the retain the state of serverside objects between postabacks. 2.What is the lifespan for items stored in ViewState? Item stored in ViewState exist for the life of the current page. This includes postbacks (to the same page). 3.What does the "EnableViewState" property do? Why would I want it on or off?

It allows the page to save the users input on a form across postbacks. It saves the serverside values for a given control into ViewState, which is stored as a hidden value on the page before sending the page to the clients browser. When the page is posted back to the server the server control is recreated with the state stored in viewstate. 4.What are the different types of Session state management options available with ASP.NET? ASP.NET provides In-Process and Out-of-Process state management. In-Process stores the session in memory on the web server. This requires the a "sticky-server" (or no loadbalancing) so that the user is always reconnected to the same web server. Out-of-Process Session state management stores data in an external data source. The external data source may be either a SQL Server or a State Server service. Out-of-Process state management requires that all objects stored in session are serializable. *********************************************************************** ************* .NET Remoting Interview Questions 1.Whats a Windows process? Its an application thats running and had been allocated memory. 2.Whats typical about a Windows process in regards to memory allocation? Each process is allocated its own block of available RAM space, no process can access another process code or data. If the process crashes, it dies alone without taking the entire OS or a bunch of other applications down. 3.Explain what relationship is between a Process, Application Domain, and Application? A process is an instance of a running application. An application is an executable on the hard drive or network. There can be numerous processes launched of the same application (5 copies of Word running), but 1 process can run just 1 application. 4.What are possible implementations of distributed applications in .NET? .NET Remoting and ASP.NET Web Services. If we talk about the Framework Class Library, noteworthy classes are in System.Runtime.Remoting and System.Web.Services. 5.What are the consideration in deciding to use .NET Remoting or ASP.NET Web Services? Remoting is a more efficient communication exchange when you can control both ends of the application involved in the communication process. Web Services provide an open-protocol-based exchange of informaion. Web Services are best when you need to communicate with an external organization or another (non-.NET) technology. 6.Whats a proxy of the server object in .NET Remoting? Its a fake copy of the server object that resides on the client side and behaves as if it was

the server. It handles the communication between real server object and the client object. This process is also known as marshaling. 7.What are remotable objects in .NET Remoting? Remotable objects are the objects that can be marshaled across the application domains. You can marshal by value, where a deep copy of the object is created and then passed to the receiver. You can also marshal by reference, where just a reference to an existing object is passed. 8.What are channels in .NET Remoting? Channels represent the objects that transfer the other serialized objects from one application domain to another and from one computer to another, as well as one process to another on the same box. A channel must exist before an object can be transferred. 9.What security measures exist for .NET Remoting in System.Runtime.Remoting? None. Security should be taken care of at the application level. Cryptography and other security techniques can be applied at application or server level. 10.What is a formatter? A formatter is an object that is responsible for encoding and serializing data into messages on one end, and deserializing and decoding messages into data on the other end. 11.Choosing between HTTP and TCP for protocols and Binary and SOAP for formatters, what are the trade-offs? Binary over TCP is the most effiecient, SOAP over HTTP is the most interoperable. 12.Whats SingleCall activation mode used for? If the server object is instantiated for responding to just one single request, the request should be made in SingleCall mode. 13.Whats Singleton activation mode? A single object is instantiated regardless of the number of clients accessing it. Lifetime of this object is determined by lifetime lease. 14.How do you define the lease of the object? By implementing ILease interface when writing the class code. 15.Can you configure a .NET Remoting object via XML file? Yes, via machine.config and application level .config file (or web.config in ASP.NET). Application-level XML settings take precedence over machine.config. 16.How can you automatically generate interface for the remotable object in .NET with Microsoft tools? Use the Soapsuds tool.

*********************************************************************** ************** C# Interview Questions 1.Does C# support multiple-inheritance? No. 2.Who is a protected class-level variable available to? It is available to any sub-class (a class inheriting this class). 3.Are private class-level variables inherited? Yes, but they are not accessible. Although they are not visible or accessible via the class interface, they are inherited. 4.Describe the accessibility modifier protected internal. It is available to classes that are within the same assembly and derived from the specified base class. 5.Whats the top .NET class that everything is derived from? System.Object. 6.What does the term immutable mean? The data value may not be changed. Note: The variable value may be changed, but the original immutable data value was discarded and a new data value was created in memory. 7.Whats the difference between System.String and System.Text.StringBuilder classes? System.String is immutable. System.StringBuilder was designed with the purpose of having a mutable string where a variety of operations can be performed. 8.Whats the advantage of using System.Text.StringBuilder over System.String? StringBuilder is more efficient in cases where there is a large amount of string manipulation. Strings are immutable, so each time a string is changed, a new instance in memory is created. 9.Can you store multiple data types in System.Array? No. 10.Whats the difference between the System.Array.CopyTo() and System.Array.Clone()? The Clone() method returns a new array (a shallow copy) object containing all the elements in the original array. The CopyTo() method copies the elements into another existing array. Both perform a shallow copy. A shallow copy means the contents (each array element) contains references to the same object as the elements in the original

array. A deep copy (which neither of these methods performs) would create a new instance of each element's object, resulting in a different, yet identacle object. 11.How can you sort the elements of the array in descending order? By calling Sort() and then Reverse() methods. 12.Whats the .NET collection class that allows an element to be accessed using a unique key? HashTable. 13.What class is underneath the SortedList class?A sorted HashTable. 14.Will the finally block get executed if an exception has not occurred? Yes. 15.Whats the C# syntax to catch any possible exception? A catch block that catches the exception of type System.Exception. You can also omit the parameter data type in this case and just write catch {}. 16.Can multiple catch blocks be executed for a single try statement? No. Once the proper catch block processed, control is transferred to the finally block (if there are any). 17.Explain the three services model commonly know as a three-tier application. Presentation (UI), Business (logic and underlying code) and Data (from storage or other sources). *********************************************************************** ************* Class Questions 1.What is the syntax to inherit from a class in C#? Place a colon and then the name of the base class. Example: class MyNewClass : MyBaseClass 2.Can you prevent your class from being inherited by another class? Yes. The keyword sealed will prevent the class from being inherited. 3.Can you allow a class to be inherited, but prevent the method from being overridden? Yes. Just leave the class public and make the method sealed. 4.Whats an abstract class? A class that cannot be instantiated. An abstract class is a class that must be inherited and

have the methods overridden. An abstract class is essentially a blueprint for a class without any implementation. 5.When do you absolutely have to declare a class as abstract? 1. When the class itself is inherited from an abstract class, but not all base abstract methods have been overridden. 2. When at least one of the methods in the class is abstract. 6.What is an interface class? Interfaces, like classes, define a set of properties, methods, and events. But unlike classes, interfaces do not provide implementation. They are implemented by classes, and defined as separate entities from classes. 7.Why cant you specify the accessibility modifier for methods inside the interface? They all must be public, and are therefore public by default. 8.Can you inherit multiple interfaces? Yes. .NET does support multiple interfaces. 9.What happens if you inherit multiple interfaces and they have conflicting method names? Its up to you to implement the method inside your own class, so implementation is left entirely up to you. This might cause a problem on a higher-level scale if similarly named methods from different interfaces expect different data, but as far as compiler cares youre okay. To Do: Investigate 10.Whats the difference between an interface and abstract class? In an interface class, all methods are abstract - there is no implementation. In an abstract class some methods can be concrete. In an interface class, no accessibility modifiers are allowed. An abstract class may have accessibility modifiers. 11.What is the difference between a Struct and a Class? Structs are value-type variables and are thus saved on the stack, additional overhead but faster retrieval. Another difference is that structs cannot inherit. *********************************************************************** ************ Method and Property Questions 1.Whats the implicit name of the parameter that gets passed into the set method/property of a class? Value. The data type of the value parameter is defined by whatever data type the property is declared as.

2.What does the keyword virtual declare for a method or property? The method or property can be overridden. 3.How is method overriding different from method overloading? When overriding a method, you change the behavior of the method for the derived class. Overloading a method simply involves having another method with the same name within the class. 4.Can you declare an override method to be static if the original method is not static? No. The signature of the virtual method must remain the same. (Note: Only the keyword virtual is changed to keyword override) 5.What are the different ways a method can be overloaded? Different parameter data types, different number of parameters, different order of parameters. 6.If a base class has a number of overloaded constructors, and an inheriting class has a number of overloaded constructors; can you enforce a call from an inherited constructor to a specific base constructor? Yes, just place a colon, and then keyword base (parameter list to invoke the appropriate constructor) in the overloaded constructor definition inside the inherited class. *********************************************************************** ************* Events and Delegates 1.Whats a delegate? A delegate object encapsulates a reference to a method. 2.Whats a multicast delegate? A delegate that has multiple handlers assigned to it. Each assigned handler (method) is called. *********************************************************************** ************ XML Documentation Questions 1.Is XML case-sensitive? Yes. 2.Whats the difference between // comments, /* */ comments and /// comments? Single-line comments, multi-line comments, and XML documentation comments.

3.How do you generate documentation from the C# file commented properly with a command-line compiler? Compile it with the /doc switch. *********************************************************************** ************* Debugging and Testing Questions 1.What debugging tools come with the .NET SDK? 1. CorDBG command-line debugger. To use CorDbg, you must compile the original C# file using the /debug switch. 2. DbgCLR graphic debugger. Visual Studio .NET uses the DbgCLR. 2.What does assert() method do? In debug compilation, assert takes in a Boolean condition as a parameter, and shows the error dialog if the condition is false. The program proceeds without any interruption if the condition is true. 3.Whats the difference between the Debug class and Trace class? Documentation looks the same. Use Debug class for debug builds, use Trace class for both debug and release builds. 4.Why are there five tracing levels in System.Diagnostics.TraceSwitcher? The tracing dumps can be quite verbose. For applications that are constantly running you run the risk of overloading the machine and the hard drive. Five levels range from None to Verbose, allowing you to fine-tune the tracing activities. 5.Where is the output of TextWriterTraceListener redirected? To the Console or a text file depending on the parameter passed to the constructor. 6.How do you debug an ASP.NET Web application? Attach the aspnet_wp.exe process to the DbgClr debugger. 7.What are three test cases you should go through in unit testing? 1. Positive test cases (correct data, correct output). 2. Negative test cases (broken or missing data, proper handling). 3. Exception test cases (exceptions are thrown and caught properly). 8.Can you change the value of a variable while debugging a C# application? Yes. If you are debugging via Visual Studio.NET, just go to Immediate window. *********************************************************************** ************

Assembly Questions 1.How is the DLL Hell problem solved in .NET? Assembly versioning allows the application to specify not only the library it needs to run (which was available under Win32), but also the version of the assembly. 2.What are the ways to deploy an assembly? An MSI installer, a CAB archive, and XCOPY command. 3.What is a satellite assembly? When you write a multilingual or multi-cultural application in .NET, and want to distribute the core application separately from the localized modules, the localized assemblies that modify the core application are called satellite assemblies. 4.What namespaces are necessary to create a localized application? System.Globalization and System.Resources. 5.What is the smallest unit of execution in .NET? an Assembly. 6.When should you call the garbage collector in .NET? As a good rule, you should not call the garbage collector. However, you could call the garbage collector when you are done using a large object (or set of objects) to force the garbage collector to dispose of those very large objects from memory. However, this is usually not a good practice. 7.How do you convert a value-type to a reference-type? Use Boxing. 8.What happens in memory when you Box and Unbox a value-type? Boxing converts a value-type to a reference-type, thus storing the object on the heap. Unboxing converts a reference-type to a value-type, thus storing the value on the stack. *********************************************************************** *********** ASP.NET DataGrid questions 1.What is datagrid? The DataGrid Web server control is a powerful tool for displaying information from a data source. It is easy to use; you can display editable data in a professional-looking grid by setting only a few properties. At the same time, the grid has a sophisticated object model that provides you with great flexibility in how you display the data. 2.Whats the difference between the System.Web.UI.WebControls.DataGrid and and System.Windows.Forms.DataGrid?

The Web UI control does not inherently support master-detail data structures. As with other Web server controls, it does not support two-way data binding. If you want to update data, you must write code to do this yourself. You can only edit one row at a time. It does not inherently support sorting, although it raises events you can handle in order to sort the grid contents. You can bind the Web Forms DataGrid to any object that supports the IEnumerable interface. The Web Forms DataGrid control supports paging. It is easy to customize the appearance and layout of the Web Forms DataGrid control as compared to the Windows Forms one. 3.How do you customize the column content inside the datagrid? If you want to customize the content of a column, make the column a template column. Template columns work like item templates in the DataList or Repeater control, except that you are defining the layout of a column rather than a row. 4.How do you apply specific formatting to the data inside the cells? You cannot specify formatting for columns generated when the grids AutoGenerateColumns property is set to true, only for bound or template columns. To format, set the columns DataFormatString property to a string-formatting expression suitable for the data type of the data you are formatting. 5.How do you hide the columns? One way to have columns appear dynamically is to create them at design time, and then to hide or show them as needed. You can do this by setting a columns Visible property. 6.How do you display an editable drop-down list? Displaying a drop-down list requires a template column in the grid. Typically, the ItemTemplate contains a control such as a data-bound Label control to show the current value of a field in the record. You then add a drop-down list to the EditItemTemplate. In Visual Studio, you can add a template column in the Property builder for the grid, and then use standard template editing to remove the default TextBox control from the EditItemTemplate and drag a DropDownList control into it instead. Alternatively, you can add the template column in HTML view. After you have created the template column with the drop-down list in it, there are two tasks. The first is to populate the list. The second is to preselect the appropriate item in the list for example, if a books genre is set to fiction, when the drop-down list displays, you often want fiction to be preselected. 7.How do you check whether the row data has been changed? The definitive way to determine whether a row has been dirtied is to handle the changed event for the controls in a row. For example, if your grid row contains a TextBox control, you can respond to the controls TextChanged event. Similarly, for check boxes, you can respond to a CheckedChanged event. In the handler for these events, you maintain a list of the rows to be updated. Generally, the best strategy is to track the primary keys of the affected rows. For example, you can maintain an ArrayList object that contains the primary keys of the rows to update.

*********************************************************************** ********** Windows code security questions 1.Whats the difference between code-based security and role-based security? Which one is better? Code security is the approach of using permissions and permission sets for a given code to run. The admin, for example, can disable running executables off the Internet or restrict access to corporate database to only few applications. Role-based security most of the time involves the code running with the privileges of the current user. This way the code cannot supposedly do more harm than mess up a single user account. Theres no better, or 100% thumbs-up approach, depending on the nature of deployment, both codebased and role-based security could be implemented to an extent. 2.How can you work with permissions from your .NET application? You can request permission to do something and you can demand certain permissions from other apps. You can also refuse permissions so that your app is not inadvertently used to destroy some data. 3.How can C# app request minimum permissions? using System.Security.Permissions; [assembly:FileDialogPermissionAttribute(SecurityAction.RequestMinimum, Unrestricted=true)] 4.Whats a code group? A code group is a set of assemblies that share a security context. 5.Whats the difference between authentication and authorization? Authentication happens first. You verify users identity based on credentials. Authorization is making sure the user only gets access to the resources he has credentials for. 6.What are the authentication modes in ASP.NET? None, Windows, Forms and Passport. 7.Are the actual permissions for the application defined at run-time or compiletime? The CLR computes actual permissions at runtime based on code group membership and the calling chain of the code. *********************************************************************** *********** NET Deployment questions

1.What do you know about .NET assemblies? Assemblies are the smallest units of versioning and deployment in the .NET application. Assemblies are also the building blocks for programs such as Web services, Windows services, serviced components, and .NET remoting applications. 2.Whats the difference between private and shared assembly? Private assembly is used inside an application only and does not have to be identified by a strong name. Shared assembly can be used by multiple applications and has to have a strong name. 3.Whats a strong name? A strong name includes the name of the assembly, version number, culture identity, and a public key token. 4.How can you tell the application to look for assemblies at the locations other than its own install? Use the directive in the XML .config file for a given application.

should do the trick. Or you can add additional search paths in the Properties box of the deployed application. 5.How can you debug failed assembly binds? Use the Assembly Binding Log Viewer (fuslogvw.exe) to find out the paths searched. 6.Where are shared assemblies stored? Global assembly cache. 7.How can you create a strong name for a .NET assembly? With the help of Strong Name tool (sn.exe). 8.Wheres global assembly cache located on the system? Usually C:\winnt\assembly or C:\windows\assembly. 9.Can you have two files with the same file name in GAC? Yes, remember that GAC is a very special folder, and while normally you would not be able to place two files with the same name into a Windows folder, GAC differentiates by version number as well, so its possible for MyApp.dll and MyApp.dll to co-exist in GAC if the first one is version 1.0.0.0 and the second one is 1.1.0.0. 10.So lets say I have an application that uses MyApp.dll assembly, version 1.0.0.0. There is a security bug in that assembly, and I publish the patch, issuing it under name MyApp.dll 1.1.0.0. How do I tell the client applications that are already installed to start using this new MyApp.dll?

Use publisher policy. To configure a publisher policy, use the publisher policy configuration file, which uses a format similar app .config file. But unlike the app .config file, a publisher policy file needs to be compiled into an assembly and placed in the GAC. 11.What is delay signing? Delay signing allows you to place a shared assembly in the GAC by signing the assembly with just the public key. This allows the assembly to be signed with the private key at a later stage, when the development process is complete and the component or assembly is ready to be deployed. This process enables developers to work with shared assemblies as if they were strongly named, and it secures the private key of the signature from being accessed at different stages of development. Posted by NMK at 4:23 AM 0 comments

*************************************************************** ***************** .NET Ado.Net


ADO .NET Most applications need data access at one point of time making it a crucial component when working with applications. Data access is making the application interact with a database, where all the data is stored. Different applications have different requirements for database access. VB .NET uses ADO .NET (Active X Data Object) as it's data access and manipulation protocol which also enables us to work with data on the Internet. Let's take a look why ADO .NET came into picture replacing ADO. Evolution of ADO.NET The first data access model, DAO (data access model) was created for local databases with the built-in Jet engine which had performance and functionality issues. Next came RDO (Remote Data Object) and ADO (Active Data Object) which were designed for Client Server architectures but soon ADO took over RDO. ADO was a good architecture but as the language changes so is the technology. With ADO, all the data is contained in a recordset object which had problems when implemented on the network and penetrating firewalls. ADO was a connected data access, which means that when a connection to the database is established the connection remains open until the application is closed. Leaving the connection open for the lifetime of the application raises concerns about database security and network traffic. Also, as databases are becoming increasingly important and as they are serving more people, a connected data access model makes us think about its productivity. For example, an application with connected data access may do well when connected to two clients, the same may do poorly when connected to 10 and might be unusable when connected to 100 or more. Also, open database connections use system resources to a maximum extent making the system performance less effective. Why ADO.NET? To cope up with some of the problems mentioned above, ADO .NET came into existence. ADO .NET addresses the above mentioned problems by maintaining a

disconnected database access model which means, when an application interacts with the database, the connection is opened to serve the request of the application and is closed as soon as the request is completed. Likewise, if a database is Updated, the connection is opened long enough to complete the Update operation and is closed. By keeping connections open for only a minimum period of time, ADO .NET conserves system resources and provides maximum security for databases and also has less impact on system performance. Also, ADO .NET when interacting with the database uses XML and converts all the data into XML format for database related operations making them more efficient. The ADO.NET Data Architecture Data Access in ADO.NET relies on two components: DataSet and Data Provider. DataSet The dataset is a disconnected, in-memory representation of data. It can be considered as a local copy of the relevant portions of the database. The DataSet is persisted in memory and the data in it can be manipulated and updated independent of the database. When the use of this DataSet is finished, changes can be made back to the central database for updating. The data in DataSet can be loaded from any valid data source like Microsoft SQL server database, an Oracle database or from a Microsoft Access database. Data Provider The Data Provider is responsible for providing and maintaining the connection to the database. A DataProvider is a set of related components that work together to provide data in an efficient and performance driven manner. The .NET Framework currently comes with two DataProviders: the SQL Data Provider which is designed only to work with Microsoft's SQL Server 7.0 or later and the OleDb DataProvider which allows us to connect to other types of databases like Access and Oracle. Each DataProvider consists of the following component classes: The Connection object which provides a connection to the database The Command object which is used to execute a command The DataReader object which provides a forward-only, read only, connected recordset The DataAdapter object which populates a disconnected DataSet with data and performs update Data access with ADO.NET can be summarized as follows: A connection object establishes the connection for the application with the database. The command object provides direct execution of the command to the database. If the command returns more than a single value, the command object returns a DataReader to provide the data. Alternatively, the DataAdapter can be used to fill the Dataset object. The database can be updated using the command object or the DataAdapter.

Component classes that make up the Data Providers

The Connection Object The Connection object creates the connection to the database. Microsoft Visual Studio .NET provides two types of Connection classes: the SqlConnection object, which is designed specifically to connect to Microsoft SQL Server 7.0 or later, and the OleDbConnection object, which can provide connections to a wide range of database types like Microsoft Access and Oracle. The Connection object contains all of the information required to open a connection to the database. The Command Object The Command object is represented by two corresponding classes: SqlCommand and OleDbCommand. Command objects are used to execute commands to a database across a data connection. The Command objects can be used to execute stored procedures on the database, SQL commands, or return complete tables directly. Command objects provide three methods that are used to execute commands on the database: ExecuteNonQuery: Executes commands that have no return values such as INSERT, UPDATE or DELETE ExecuteScalar: Returns a single value from a database query ExecuteReader: Returns a result set by way of a DataReader object The DataReader Object The DataReader object provides a forward-only, read-only, connected stream recordset from a database. Unlike other components of the Data Provider, DataReader objects cannot be directly instantiated. Rather, the DataReader is returned as the result of the Command object's ExecuteReader method. The SqlCommand.ExecuteReader method returns a SqlDataReader object, and the OleDbCommand.ExecuteReader method returns an OleDbDataReader object. The DataReader can provide rows of data directly to application logic when you do not need to keep the data cached in memory. Because only one row is in memory at a time, the DataReader provides the lowest overhead in terms of system performance but requires the exclusive use of an open Connection object for the lifetime of the DataReader. The DataAdapter Object The DataAdapter is the class at the core of ADO .NET's disconnected data access. It is essentially the middleman facilitating all communication between the database and a DataSet. The DataAdapter is used either to fill a DataTable or DataSet with data from the database with it's Fill method. After the memory-resident data has been manipulated, the DataAdapter can commit the changes to the database by calling the Update method. The DataAdapter provides four properties that represent database commands: SelectCommand InsertCommand DeleteCommand UpdateCommand

When the Update method is called, changes in the DataSet are copied back to the database and the appropriate InsertCommand, DeleteCommand, or UpdateCommand is executed. Posted by NMK at 4:13 AM 0 comments

.NET Generics
Generics in .NET 2.0 Generics in .NET 2.0 is an exciting feature. But what are generics? Are they for you? Should you use them in your applications? In this article, we'll answer these questions and take a closer look at generics usage, and their capabilities and limitations. Type Safety Many of the languages in .NET, like C#, C++, and VB.NET (with option strict on), are strongly typed languages. As a programmer using these languages, you expect the compiler to perform type-safety checks. For instance, if you try to treat or cast a reference of the type Book as a reference of the type Vehicle, the compiler will tell you that such a cast is invalid. However, when it comes to collections in .NET 1.0 and 1.1, there is no help with type safety. Consider an ArrayList, for example. It holds a collection of objects. This allows you to place an object of just about any type into an ArrayList. Let's take a look at the code in Example 1. Example 1. Lack of type safety in ArrayList using System; using System.Collections; namespace TestApp { class Test { [STAThread] static void Main(string[] args) { ArrayList list = new ArrayList(); list.Add(3); list.Add(4); //list.Add(5.0); int total = 0; foreach(int val in list) { total = total + val; }

Console.WriteLine( "Total is {0}", total); } } } I am creating an instance of ArrayList and adding 3 and 4 to it. Then I loop though the ArrayList, fetching the int values from it and adding them. This program will produce the result "Total is 7." Now, if I uncomment the statement: list.Add(5.0); the program will produce a runtime exception: Unhandled Exception: System.InvalidCastException: Specified cast is not valid. at TestApp.Test.Main(String[] args) in c:\workarea\testapp\class1.cs:line 18 What went wrong? Remember that ArrayList holds a collection of objects. When you add a 3 to the ArrayList, you are boxing the value 3. When you loop though the list, you are unboxing the elements as int. However, when you add the value 5.0, you are boxing a double. On line 18, that double value is being unboxed as an int, and that is the cause of failure. (The above example, if it was written using VB.NET would not fail, however. The reason is VB.NET, instead of unboxing, invokes a method that converts the values into Integers. The VB.NET code will also fail if the value in ArrayList is not convertible to Integer. See Gotcha #9, "Typeless ArrayList Isn't Type-Safe," in my book .NET Gotchas for further details.) As a programmer who is used to the type safety provided by the language, you would rather have the problems pop up during compile time instead of runtime. This is where generics come in. What Are Generics? Generics allow you to realize type safety at compile time. They allow you to create a data structure without committing to a specific data type. When the data structure is used, however, the compiler makes sure that the types used with it are consistent for type safety. Generics provide type safety, but without any loss of performance or code bloat. While they are similar to templates in C++ in this regard, they are very different in their implementation. Using Generics Collections The System.Collections.Generics namespace contains the generics collections in .NET 2.0. Various collections/container classes have been "parameterized." To use them, simply specify the type for the parameterized type and off you go. See Example 2:

Example 2. Type-safe generic List List aList = new List(); aList.Add(3); aList.Add(4); // aList.Add(5.0); int total = 0; foreach(int val in aList) { total = total + val; } Console.WriteLine("Total is {0}", total); In Example 2, I am creating an instance of the generic List with the type int, given within the angle brackets (<>), as the parameterized type. This code, when executed, will produce the result "Total is 7." Now, if I uncomment the statement doubleList.Add(5.0);, I will get a compilation error. The compiler determines that it can't send the value 5.0 to the method Add(), as it only accepts an int. Unlike the example in Example 1, this code has type safety built into it. CLR Support for Generics Generics is not a mere language-level feature. The .NET CLR recognizes generics. In that regard, the use of generics is a first-class feature in .NET. For each type of parameter used for a generic, a class is not rolled out in the Microsoft Intermediate Language (MSIL). In other words, your assembly contains only one definition of your parameterized data structure or class, irrespective of how many different types are used for that parameterized type. For instance, if you define a generic type MyList, only one definition of that type is present in MSIL. When the program executes, different classes are dynamically created, one for each type for the parameterized type. If you use MyList and MyList, then two classes are created on the fly when your program executes. Let's examine this further in Example 3. Example 3. Writing a generic class //MyList.cs #region Using directives using System; using System.Collections.Generic; using System.Text; #endregion namespace CLRSupportExample { public class MyList

{ private static int objCount = 0; public MyList() { objCount++; } public int Count { get { return objCount; } } } } //Program.cs #region Using directives using System; using System.Collections.Generic; using System.Text; #endregion namespace CLRSupportExample { class SampleClass {} class Program { static void Main(string[] args) { MyList myIntList = new MyList(); MyList myIntList2 = new MyList(); MyList myDoubleList = new MyList(); MyList mySampleList = new MyList(); Console.WriteLine(myIntList.Count); Console.WriteLine(myIntList2.Count);

Console.WriteLine(myDoubleList.Count); Console.WriteLine(mySampleList.Count); Console.WriteLine( new MyList().Count); Console.ReadLine(); } } } I have created a generic class named MyList. To parameterize it, I simply inserted an angle bracket. The T within <> represents the actual type that will be specified when the class is used. Within the MyList class, I have a static field, objCount. I am incrementing this within the constructor so I can find out how many objects of that type are created by the user of my class. The Count property returns the number of instances of the same type as the instance on which it is called. In the Main() method, I am creating two instances of MyList, one instance of MyList, and two instances of MyList, where SampleClass is a class I have defined. The question is: what will be the value of Count? That is, what is the output from the above program? Go ahead and think on this and try to answer this question before you read further. Have you worked the above question? Did you get the following answer? 2 2 1 1 2 The first two values of 2 are for MyList. The first value of 1 is for MyList. The second value of 1 is for MyList; only one instance of this type had been created at that point in the control flow. The last value of 2 is also for MyList, since another instance of this type has been created at this point in the code. The above example illustrates that MyList is a different class from MyList, which in turn is a different class from MyList. So, in this example, we have four classes of MyList: MyList, MyList, MyList, and MyList. Again, while there are four classes of MyList, only one is stored in MSIL. How can we prove this? Figure 1 shows the MSIL using the ildasm.exe tool.

Figure 1. A look at MSIL for Example 3 Generics Methods In addition to having generic classes, you may also have generic methods. Generic methods may be part of any class. Let's look at Example 4:

Example 4. A generic method public class Program { public static void Copy(List source, List destination) { foreach (T obj in source) { destination.Add(obj); } } static void Main(string[] args) { List lst1 = new List(); lst1.Add(2); lst1.Add(4); List lst2 = new List(); Copy(lst1, lst2); Console.WriteLine(lst2.Count); } } The Copy() method is a generic method that works with the parameterized type T. When Copy() is invoked in Main(), the compiler figures out the specific type to use, based on the arguments presented to the Copy() method. Unbounded Type Parameters If you create generics data structures or classes, like MyList in Example 3, there are no restrictions on what type the parametric type you may use for the parameteric type. This leads to some limitations, however. For example, you are not allowed to use ==, !=, or < on instances of the parametric type: if (obj1 == obj2) The implementation of operators such as == and != are different for value types and reference types. The behavior of the code may not be easier to understand if these were allowed arbitrarily. Another restriction is the use of default constructor. For instance, if you write new T(), you will get a compilation error, because not all classes have a noparameter constructor. What if you do want to create an object using new T(), or you want to use operators such as == and !=? You can, but first you have to constraint the type that can be used for the parameterized type. Let's look at how to do that. Constraints and Their Benefits

A generic class allows you to write your class without committing to any type, yet allows the user of your class, later on, to indicate the specific type to be used. While this gives greater flexibility by placing some constraints on the types that may be used for the parameterized type, you gain some control in writing your class. Let's look at an example: Example 5. The need for constraints: code that will not compile public static T Max(T op1, T op2) { if (op1.CompareTo(op2) < 0) return op1; return op2; } The code in Example 5 will produce a compilation error: Error 1 'T' does not contain a definition for 'CompareTo' Assume I need the type to support the CompareTo() method. I can specify this by using the constraint that the type specified for the parameterized type must implement the IComparable interface. Example 6 has the code: Example 6. Specifying a constraint public static T Max(T op1, T op2) where T : IComparable { if (op1.CompareTo(op2) < 0) return op1; return op2; } In Example 6, I have specified the constraint that the type used for parameterized type must inherit from (implement) IComparable. The following constraints may be used: where T : struct type must be a value type (a struct) where T : class type must be reference type (a class) where T : new() type must have a no-parameter constructor where T : class_name type may be either class_name or one of its sub-classes (or is below class_name in the inheritance hierarchy) where T : interface_name type must implement the specified interface You may specify a combination of constraints, as in: where T : IComparable, new(). This says that the type for the parameterized type must implement the IComparable interface and must have a no-parameter constructor. Inheritance and Generics A generic class that uses parameterized types, like MyClass1, is called an open-

constructed generic. A generic class that uses no parameterized types, like MyClass1, is called a closed-constructed generic. You may derive from a closed-constructed generic; that is, you may inherit a class named MyClass2 from another class named MyClass1, as in: public class MyClass2 : MyClass1 You may derive from an open-constructed generic, provided the type is parameterized. For example: public class MyClass2 : MyClass2 is valid, but public class MyClass2 : MyClass2 is not valid, where Y is a parameterized type. Non-generic classes may derive from closed-constructed generic classes, but not from open-constructed generic classes. That is, public class MyClass : MyClass1 is valid, but public class MyClass : MyClass1 is not. Generics and Substitutability When we deal with inheritance, we need to be careful about substitutability. If B inherits from A, then anywhere an object of A is used, an object of B may also be used. Let's assume we have a Basket of Fruits (Basket). We have Apple and Banana (kinds of Fruits) inherit from Fruit. Should Basket of Apples (Basket) inherit from Basket of Fruits (Basket)? The answer is no, if we think about substitutability. Why? Consider a method that works with a Basket of Fruits: public void Package(Basket aBasket) { aBasket.Add(new Apple()); aBasket.Add(new Banana()); } If an instance of Basket is sent to this method, the method would add an Apple and a Banana. However, what would the effect be of sending an instance of a Basket to this method? You see, this gets tricky. That is why if you write: Basket anAppleBasket = new Basket(); Package(anAppleBasket); You will get an error:

Error 2 Argument '1': cannot convert from 'TestApp.Basket' to 'TestApp.Basket' The compiler protects us from shooting ourselves in the foot by making sure we don't arbitrarily pass a collection of derived where a collection of base is expected. That is pretty good, isn't it? Wait a minute, though! That was great in the above example, but there are times when I do want to pass a collection of derived where a collection of base is needed. For instance, consider an Animal (such as Monkey), which has a method named Eat that takes a Basket, as shown below: public void Eat(Basket fruits) { foreach (Fruit aFruit in fruits) { // code to eat fruit } } Now, you may call: Basket fruitsBasket = new Basket(); // Fruits added to Basket anAnimal.Eat(fruitsBasket); What if you have a Basket with you? Would it make sense to send a Basket to the Eat method? In this case, it would, no? But the compiler will give us an error if we try: Basket bananaBasket = new Basket(); // anAnimal.Eat(bananaBasket); The compiler is protecting us here. How can we ask the compiler to let us through in this particular case? Again, constraints come in handy for this: public void Eat(Basket fruits) where T : Fruit { foreach (Fruit aFruit in fruits) { // code to eat fruit } }

In writing the Eat() method, I am asking the compiler to allow a Basket of any type T, where T is of the type Fruit or any class that inherits from Fruit. Generics and Delegates Delegates can be generics as well. This provides quite a bit of flexibility. Assume we are interested in writing a framework. We need to provide a mechanism for an event source to talk to an object that is interested in the event. Our framework may not be able to control what the events are. You may be dealing with a stock price change (double price). I may be dealing with temperature change in a boiler (temperature value), where Temperature may be an object that has some information such as value, units, threshold, and so on. How can I define an interface for these events? Let's take a look at how we can realize this by using pre-generic delegates: public delegate void NotifyDelegate(Object info); public interface ISource { event NotifyDelegate NotifyActivity; } We have the NotifyDelegate accepting an Object. This is the best we could do in the past, as Object can be use to represent different types such as double, Temperature, and so on, though it involves boxing overhead for value types. ISource is an interface that different sources will support. The framework exposes the NotifyDelegate delegate and the ISource interface. Let's look at two different sources: public class StockPriceSource : ISource { public event NotifyDelegate NotifyActivity; // } public class BoilerSource : ISource { public event NotifyDelegate NotifyActivity; // } If we have an object of each of the above classes, we would register a handler for events, as shown below: StockPriceSource stockSource = new StockPriceSource();

stockSource.NotifyActivity += new NotifyDelegate( stockSource_NotifyActivity); // Not necessarily in the same program we may have BoilerSource boilerSource = new BoilerSource(); boilerSource.NotifyActivity += new NotifyDelegate( boilerSource_NotifyActivity); In the delegate handler methods, we would do something like the following: For the handler for stock event, we would have: void stockSource_NotifyActivity(object info) { double price = (double)info; // downcast required before use } The handler for the temperature event may look like this: void boilerSource_NotifyActivity(object info) { Temperature value = info as Temperature; // downcast required before use } The above code is not intuitive, and is messy with the downcasts. With generics, the code is more readable and easier to work with. Let's take a look at the code with generics at work: Here is the delegate and the interface: public delegate void NotifyDelegate(T info); public interface ISource { event NotifyDelegate NotifyActivity; } We have parameterized the delegate and the interface. The implementor of the interface can now say what the type should be. The Stock source would look like this: public class StockPriceSource : ISource {

public event NotifyDelegate NotifyActivity; // } and the Boiler source would look like this: public class BoilerSource : ISource { public event NotifyDelegate NotifyActivity; // } If we have an object of each of the above classes, we would register a handler for events, as shown below: StockPriceSource stockSource = new StockPriceSource(); stockSource.NotifyActivity += new NotifyDelegate( stockSource_NotifyActivity); // Not necessarily in the same program we may have BoilerSource boilerSource = new BoilerSource(); boilerSource.NotifyActivity += new NotifyDelegate( boilerSource_NotifyActivity); Now, the event handler for stock price would be: void stockSource_NotifyActivity(double info) { // } and the event handler for the temperature is: void boilerSource_NotifyActivity(Temperature info) { // } This code has no downcast and the types involved are very clear. Generics and Reflection Since generics are supported at the CLR level, you may use reflection API to get information about generics. One thing may be a bit confusing when you are new to generics: you have to keep in mind that there is the generics class you write and then there are types created from it at runtime. So, when using the reflection API, you have to make an extra effort to keep in mind which type you are dealing with. I illustrate this in

the Example 7: Example 7. Reflection on generics public class MyClass { } class Program { static void Main(string[] args) { MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); Type type1 = obj1.GetType(); Type type2 = obj2.GetType(); Console.WriteLine("obj1's Type"); Console.WriteLine(type1.FullName); Console.WriteLine( type1.GetGenericTypeDefinition().FullName); Console.WriteLine("obj2's Type"); Console.WriteLine(type2.FullName); Console.WriteLine( type2.GetGenericTypeDefinition().FullName); } } I have an instance of MyClass. I ask for the class name of this instance. Then I ask for the GenericTypeDefinition() of this type. GenericTypeDefinition() will return the type metadata for MyClass in this example. You may call IsGenericTypeDefinition to ask if this is a generic type (like MyClass) or if its type parameters have been specified (like MyClass). Similarly, I query an instance of MyClass for its metadata. The output from the above program is shown below: obj1's Type TestApp.MyClass`1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] TestApp.MyClass`1 obj2's Type TestApp.MyClass`1 [[System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] TestApp.MyClass`1 We can see that MyClass and MyClass are classes that belong to the mscorlib assembly

(dynamically created), while the class MyClass belongs to my assembly. Generics' Limitations We have seen the power of generics so far in this article. Are there any limitations? There is one significant limitation, which I hope Microsoft addresses. In expressing constraints, we can specify that the parameter type must inherit from a class. How about specifying that the parameter must be a base class of some class? Why do we need that? In Example 4, I showed you a Copy() method that copied contents of a source List to a destination list. I can use it as follows: List appleList1 = new List(); List appleList2 = new List(); Copy(appleList1, appleList2); However, what if I want to copy apples from one list into a list of Fruits (where Apple inherits from Fruit). Most certainly, a list of Fruits can hold Apples. So I want to write: List appleList1 = new List(); List fruitsList2 = new List(); Copy(appleList1, fruitsList2); This will not compile. You will get an error: Error 1 The type arguments for method 'TestApp.Program.Copy(System.Collections.Generic.List, System.Collections.Generic.List)' cannot be inferred from the usage. The compiler, based on the call arguments, is not able to decide what T should be. What I really want to say is that the Copy should accept a List of some type as the first parameter, and a List of the same type or a List of its base type as the second parameter. Even though there is no way to say that a type must be a base type of another, you can get around this limitation by still using the constraints. Here is how: public static void Copy(List source, List destination) where T : E Here I have specified that the type T must be the same type as, or a sub-type of, E. We got lucky with this. Why? Both T and E are being defined here. We were able to specify the constraint (though the C# specification discourages using E to define the constraint of T when E is being defined as well). Consider the following example, however: public class MyList

{ public void CopyTo(MyList destination) { // } } I should be able to call CopyTo: MyList appleList = new MyList(); MyList appleList2 = new MyList(); // appleList.CopyTo(appleList2); I must also be able to do this: MyList appleList = new MyList(); MyList fruitList2 = new MyList(); // appleList.CopyTo(fruitList2); This, of course, will not work. How can we fix this? We need to say that the argument to CopyTo() can be either MyList of some type or MyList of the base type of that type. However, the constraints do not allow us to specify the base type. How about the following? public void CopyTo(MyList destination) where T : E Sorry, this does not work. It gives a compilation error that: Error 1 'TestApp.MyList.CopyTo()' does not define type parameter 'T' Of course, you may write the code to accept MyList of any arbitrary type and then within your code, you may verify that the type is one of acceptable type. However, this pushes the checking to runtime, losing the benefit of compile-time type safety. Conclusion Generics in .NET 2.0 are very powerful. They allow you to write code without committing to a particular type, yet your code can enjoy type safety. Generics are implemented in such a way as to provide good performance and avoid code bloat. While there is the drawback of constraints' inability to specify that a type must be a base type of another type, the constraints mechanism gives you the flexibility to write code with a greater degree of freedom than sticking with the least-common-denominator capability of all types. Posted by NMK at 3:13 AM 0 comments

Wednesday, June 11, 2008

*************************************************************** ******************* .NET Assembly


Introduction to .NET Assemblies What is an assembly? .An Assembly is a logical unit of code .Assembly physically exist as DLLs or EXEs .One assembly can contain one or more files .The constituent files can include any file types like image files, text files etc. along with DLLs or EXEs .When you compile your source code by default the exe/dll generated is actually an assembly .Unless your code is bundled as assembly it can not be used in any other application .When you talk about version of a component you are actually talking about version of the assembly to which the component belongs. .Every assembly file contains information about itself. This information is called as Assembly Manifest. What is assembly manifest? .Assembly manifest is a data structure which stores information about an assembly .This information is stored within the assembly file(DLL/EXE) itself .The information includes version information, list of constituent files etc. What is private and shared assembly? The assembly which is used only by a single application is called as private assembly. Suppose you created a DLL which encapsulates your business logic. This DLL will be used by your client application only and not by any other application. In order to run the application properly your DLL must reside in the same folder in which the client application is installed. Thus the assembly is private to your application. Suppose that you are creating a general purpose DLL which provides functionality which will be used by variety of applications. Now, instead of each client application having its own copy of DLL you can place the DLL in 'global assembly cache'. Such assemblies are called as shared assemblies.

What is Global Assembly Cache? Global assembly cache is nothing but a special disk folder where all the shared assemblies will be kept. It is located under :\WinNT\Assembly folder. How assemblies avoid DLL Hell? As stated earlier most of the assemblies are private. Hence each client application refers assemblies from its own installation folder. So, even though there are multiple versions of same assembly they will not conflict with each other. Consider following example : .You created assembly Assembly1 .You also created a client application which uses Assembly1 say Client1 .You installed the client in C:\MyApp1 and also placed Assembly1 in this folder .After some days you changed Assembly1 .You now created another application Client2 which uses this changed Assembly1 .You installed Client2 in C:\MyApp2 and also placed changed Assembly1 in this folder .Since both the clients are referring to their own versions of Assembly1 everything goes on smoothly Now consider the case when you develop assembly that is shared one. In this case it is important to know how assemblies are versioned. All assemblies has a version number in the form: major.minor.build.revision If you change the original assembly the changed version will be considered compatible with existing one if the major and minor versions of both the assemblies match. When the client application requests assembly the requested version number is matched against available versions and the version matching major and minor version numbers and having most latest build and revision number are supplied. How do I create shared assemblies? Following steps are involved in creating shared assemblies : .Create your DLL/EXE source code .Generate unique assembly name using SN utility .Sign your DLL/EXE with the private key by modifying AssemblyInfo file

.Compile your DLL/EXE .Place the resultant DLL/EXE in global assembly cache using AL utility How do I create unique assembly name? Microsoft now uses a public-private key pair to uniquely identify an assembly. These keys are generated using a utility called SN.exe (SN stands for shared name). The most common syntax of is : sn -k mykeyfile.key Where k represents that we want to generate a key and the file name followed is the file in which the keys will be stored. How do I sign my DLL/EXE? Before placing the assembly into shared cache you need to sign it using the keys we just generated. You mention the signing information in a special file called AssemblyInfo. Open the file from VS.NET solution explorer and change it to include following lines : [assembly:AssemblyKeyFile("file_path")] Now recompile the project and the assembly will be signed for you. Note : You can also supply the key file information during command line compilation via /a.keyfile switch. How do I place the assembly in shared cache? Microsoft has provided a utility called AL.exe to actually place your assembly in shared cache. AL /i:my_dll.dll Now your dll will be placed at proper location by the utility. Hands On... Now, that we have understood the basics of assemblies let us apply our knowledge by developing a simple shared assembly. In this example we will create a VB.NET component called SampleGAC ( GAC stands for Global Assembly Cache). We will also create a key file named sample.key. We will sign our component with this key file and place it in Global Assembly Cache. Step 1 : Creating our sample component Here is the code for the component. It just includes one method which returns a string.

imports system namespace BAJComponents public class Sample public function GetData() as string return "hello world" end function end class end namespace Step 2 : Generate a key file To generate the key file issue following command at command prompt. sn -k sample.key This will generate the key file in the same folder Step 3 : Sign your component with the key Now, wee will sign the assembly with the key file we just created. vbc sampleGAC.vb /t:library /a.keyfile:sample.key Step 4 : Host the signed assembly in Global Assembly Cache We will use AL utility to place the assembly in Global Assembly Cache. AL /i:sampleGAC.dll After hosting the assembly just go to WINNT\Assembly folder and you will find your assembly listed there. Note how the assembly folder is treated differently that normal folders. Step 5 : Test that our assembly works Now, we will create a sample client application which uses our shared assembly. Just create a sample code as listed below : imports system imports BAJComponents public class SampleTest shared sub main() dim x as new sample dim s as string="x".getdata() console.writeline(s) end sub end class Compile above code using :

vbc sampletest.vb /t:exe /r: Now, copy the resulting EXE in any other folder and run it. It will display "Hello World" indicating that it is using our shared assembly. Posted by NMK at 5:02 AM 0 comments

Friday, June 13, 2008


.NET Web Services
Creating a .NET Web Service Introduction Microsoft .NET marketing has created a huge hype about its Web Services. This is the first of two articles on Web Services. Here we will create a .NET Web Service using C#. We will look closely at the Discovery protocol, UDDI, and the future of the Web Services. In the next article, we will concentrate on consuming existing Web Services on multiple platforms (i.e., Web, WAP-enabled mobile phones, and windows applications). Why do we need Web Services? After buying something over the Internet, you may have wondered about the delivery status. Calling the delivery company consumes your time, and it's also not a value-added activity for the delivery company. To eliminate this scenario the delivery company needs to expose the delivery information without compromising its security. Enterprise security architecture can be very sophisticated. What if we can just use port 80 (the Web server port) and expose the information through the Web server? Still, we have to build a whole new Web application to extract data from the core business applications. This will cost the delivery company money. All the company wants is to expose the delivery status and concentrate on its core business. This is where Web Services come in. What is a Web Service? Web Services are a very general model for building applications and can be implemented for any operation system that supports communication over the Internet. Web Services use the best of component-based development and the Web. Component-base object models like Distributed Component Object Model (DCOM), Remote Method Invocation (RMI), and Internet Inter-Orb Protocol (IIOP) have been around for some time. Unfortunately all these models depend on an object-model-specific protocol. Web Services extend these models a bit further to communicate with the Simple Object Access Protocol (SOAP) and Extensible Markup Language (XML) to eradicate the object-modelspecific protocol barrier (see Figure 1). Web Services basically uses Hypertext Transfer Protocol (HTTP) and SOAP to make business data available on the Web. It exposes the business objects (COM objects, Java Beans, etc.) to SOAP calls over HTTP and executes remote function calls. The Web Service consumers are able to invoke method calls on remote objects by using SOAP and

HTTP over the Web. Figure 1. SOAP calls are remote function calls that invoke method executions on Web Service components at Location B. The output is rendered as XML and passed back to the user at Location A. How is the user at Location A aware of the semantics of the Web Service at Location B? This question is answered by conforming to a common standard. Service Description Language (SDL), SOAP Contract Language (SCL) and Network Accessible Specification Language (NASSL) are some XML-like languages built for this purpose. However, IBM and Microsoft recently agreed on the Web Service Description Language (WSDL) as the Web Service standard. The structure of the Web Service components is exposed using this Web Service Description Language. WSDL 1.1 is a XML document describing the attributes and interfaces of the Web Service. The new specification is available at msdn.microsoft.com/xml/general/wsdl.asp. The task ahead The best way to learn about Web Services is to create one. We all are familiar with stock quote services. The NASDAQ, Dow Jones, and Australian Stock Exchange are famous examples. All of them provide an interface to enter a company code and receive the latest stock price. We will try to replicate the same functionality. The input parameters for our securities Web service will be a company code. The Web service will extract the price feed by executing middle-tier business logic functions. The business logic functions are kept to a bare minimum to concentrate on the Web service features. Tools to create a Web Service The core software component to implement this application will be MS .NET Framework SDK, which is currently in beta. You can download a version from Microsoft. I used Windows 2000 Advance Server on a Pentium III with 300 MB of RAM. The preferred Integration Development Environment (IDE) to create Web Services is Visual Studio .NET. However, you can easily use any text editor (WordPad, Notepad, Visual Studio 6.0) to create a Web Service file. I assume you are familiar with the following concepts: Basic knowledge of .NET platform Basic knowledge of C# Basic knowledge of object-oriented concepts

Creating a Web Service We are going to use C# to create a Web Service called "SecurityWebService." A Web Service file will have an .ASMX file extension. (as opposed to an .ASPX file extension of a ASP.NET file). The first line of the file will look like

This line will instruct the compiler to run on Web Service mode and the name of the C# class. We also need to access the Web Service namespace. It is also a good practice to add a reference to the System namespace. using System; using System.Web.Services; The SecurityWebService class should inherit the functionality of the Web Services class. Therefore, we put the following line of code: public class SecurityWebService : WebService Now we can use our object-oriented programming skills to build a class. C# classes are very similar to C++ or Java classes. It will be a walk in the park to create a C# class for anyone with either language-coding skills. Dot-net Web Services are intelligent enough to cast basic data types. Therefore, if we return "int," "float," or "string" data types, it can convert them to standard XML output. Unfortunately, in most cases we need get a collection of data regarding a single entity. Let's take an example. Our SecurityWebService stock quotes service requires the user to enter a company code, and it will deliver the full company name and the current stock price. Therefore, we have three pieces of information for a single company: Company code (data type - string) Company name (data type - string) Price (data type - Double) We need to extract all this data when we are referring to a single stock quote. There are several ways of doing this. The best way could be to bundle them in an enumerated data type. We can use "structs" in C# to do this, which is very similar to C++ structs. public struct SecurityInfo { public string Code; public string CompanyName; public double Price; }

Now we have all the building blocks to create our Web Service. Therefore, our code will look like.

using System; using System.Web.Services; public struct SecurityInfo { public string Code; public string CompanyName; public double Price; } public class SecurityWebService : WebService { private SecurityInfo Security; public SecurityWebService() { Security.Code = ""; Security.CompanyName = ""; Security.Price = 0; } private void AssignValues(string Code) { // This is where you use your business components. // Method calls on Business components are used to populate the data. // For demonstration purposes, I will add a string to the Code and // use a random number generator to create the price feed. Security.Code = Code; Security.CompanyName = Code + " Pty Ltd"; Random RandomNumber = new System.Random(); Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##")); } [WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)] public SecurityInfo GetSecurityInfo(string Code) {

AssignValues(Code); SecurityInfo SecurityDetails = new SecurityInfo(); SecurityDetails.Code = Security.Code; SecurityDetails.CompanyName = Security.CompanyName; SecurityDetails.Price = Security.Price; return SecurityDetails; } } Remember, this Web Service can be accessed through HTTP for any use. We may be referring to sensitive business data in the code and wouldn't want it to fall into the wrong hands. The solution is to protect the business logic function and only have access to the presentation functions. This is achieved by using the keyword "[Web Method]" in C#. Let's look at the function headers of our code. [WebMethod(Description="This......",EnableSession=false)] public SecurityInfo GetSecurityInfo(string Code) This function is exposed to the public. The "description" tag can be used to describe the Web Service functionality. Since we will not be storing any session data, we will disable the session state. private void AssignValues(string Code) This is a business logic function that should not be publicly available. We do not want our sensitive business information publicly available on the Web. (Note:- Even if you change the "private" keyword to "public," it will still not be publicly available. You guessed it, the keyword "[Web Method]" is not used.) We can use the business logic in this function to get the newest stock price quote. For the purpose of this article I have added some text to the company code to create the company name. The price value is generated using a random number generator. We may save this file as "SampleService.asmx" under an Internet Information Service (IIS)-controlled directory. I have saved it under a virtual directory called "/work/aspx." I'll bring it up on a Web browser.

This is a Web page rendered by the .NET Framework. We did not create this page. (The page is generated automatically by the system. I did not write any code to render it on the browser. This graphic is a by-product of the previous code.) This ready-to-use functionality is quite adequate for a simple Web Service. The presentation of this page can be changed very easily by using ASP.NET pagelets and config.web files. A very good example can be found at http://www.ibuyspy.com/store/InstantOrder.asmx.

Notice a link to "SDL Contract." (Even if we are using WSDL, .NET Beta still refers to SDL. Hopefully this will be rectified in the next version). This is the description of the Web Service to create a proxy object. (I will explain this in the next article.) This basically gives an overview of the Web Service and it's public interface. If you look closely, you will only see the "Web-only" methods being illustrated. All the private functions and attributes are not described in the SDL contract. The SDL contract for the SecurityWebService can be found in Appendix A. How do we use a Web Service? Now we can use this Web Service. Let's enter some values to get a bogus price feed.

By clicking the Invoke button a new window will appear with the following XML document

This is how the Web Service releases information. We need to write clients to extract the information from the XML document. Theses clients could be A Web page A console / Windows application A Wireless Markup Language (WML) / WMLScript to interact with mobile phones A Palm / Win CE application to use on Personal Digital Assistants (PDAs). You can also call the Web Service directly using the HTTP GET method. In this case we will not be going through the above Web page and clicking the Invoke button. The syntax for directly calling the Web Service using HTTP GET is http://server/webServiceName.asmx/functionName?parameter=parameterValue Therefore, the call for our Web Service will be http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM This will produce the same result as clicking the Invoke button. Now we know how to create a Web Service and use it. But the work is half done. How will our clients find our Web Service? Is there any way to search for our Web Service on the Internet? Is there a Web crawler or a Yahoo search engine for Web Services? In order to answer these questions we need to create a "discovery" file for our Web Service. Creating a Discovery file

Web Service discovery is the process of locating and interrogating Web Service descriptions, which is a preliminary step for accessing a Web Service. It is through the discovery process that Web Service clients learn that a Web Service exists, what its capabilities are, and how to properly interact with it. Discovery file is a XML document with a .DISCO extension. It is not compulsory to create a discovery file for each Web Service. Here is a sample discovery file for our securities Web Service.

We can name this file "SampleService.disco" and save it to the same directory as the Web Service. If we are creating any other Web Services under the "/work/aspx" directory, it is wise to enable "dynamic discovery." Dynamic discovery will scan for all the *.DISCO files in all the subdirectories of "/work/aspx" automatically.

An example of an active discovery file can be found at http://services3.xmethods.net/dotnet/default.disco. By analyzing the discovery file we can find where the Web Services reside in the system. Unfortunately both these methods require you to know the exact URL of the discovery file. If we cannot find the discovery file, we will not be able to locate the Web Services. Universal Description, Discovery, and Integration (UDDI) describes mechanisms to advertise existing Web Services. This technology is still at the infant stage. UDDI is an open, Internet-based specification designed to be the building block that will enable businesses to quickly, easily, and dynamically find and transact business with one another using their preferred applications. A reference site for UDDI is http://uddi.microsoft.com/. There have been a lot of Web Services written by developers. www.xmethods.com is one of the sites that has an index of Web Services. Some developers are building WSDL search engines to find Web Services on the Web. Deploying a Web Service Deploying the Web Services from development to staging or production is very simple. Similar to ASP.NET applications, just copy the .ASMX file and the .DISCO files to the appropriate directories, and you are in business. The future of the Web Services The future looks bright for the Web Service technology. Microsoft is not alone in the race for Web Service technology. Sun and IBM are very interested. There are SOAP toolkits available for Apache and Java Web servers. I believe Web Services needs a bit of work, especially the Web Service discovery process. It is still very primitive. On a positive note, Web Services have the potential to introduce new concepts to the Web. One I refer to as "pay per view" architecture. Similar to pay-TV, we can build Web sites that can generate revenue for each request a user sends (as opposed to a flat, monthly subscription). In order to get some data, we can sometimes pay a small fee.

Commercially this could be handy for a lot of people. Examples Online newspaper sites can publish a 10-year-old article with a $2 "pay per view" structure. Stock market portals can itemize every user portfolio for every single stock quote and build pricing and discount structures. And the list goes on ... On a very optimistic note, Web Services can be described as the "plug and play" building blocks of enterprise Business to Business (B2B) Web solutions. -------------------------------- Part II -----------------------------Asynchronous Web Services for Visual Basic .NET Asynchronous Web Services rely on the basic asynchronous behavior built into .NET; it is part of the multithreading model of .NET. The basic idea is that you can invoke a Web Method asynchronously, which means it returns before it has finished the computation, and the Web Service will tell you at a later time when it has finished. Collectively, all of this technology relies on the CodeDOM, multithreading, SOAP, HTTP, and delegates, which illustrates why a well-architected platform is essential. Fortunately, .NET is designed so that you don't really have to master any of these technologies to use asynchronous Web Services. The hardest thing you have to learn to do is to use delegates. When you are finished reading this article you will have the basic information necessary to invoke Web Methods asynchronously. We'll use a basic Web Service that returns simple data, pretending the process is long enough to warrant an asynchronous call. In July 19th's article, I wrote about calculating prime numbers. I will use a Web Service based on the ability to calculate prime numbers, returning a Boolean to indicate primeness. Integrating a Web Service into Your Application The basic steps for integrating a Web Service are reviewed in the numbered-list that follows for convenience. Create the solution for you client application Use UDDI to find a Web Service (or you can use a known Web Service) Select Project|Add Web Reference, entering the URL for the Web Service in the Address bar. (This process is just like browsing in internet explorer) When you have navigated to the URL of the Web Service, the Add Web Reference button should be enabled in the Add Reference dialog. Click Add Reference After you have selected the .asmx file representing the Web Service and added the

reference, a new entry will be added to your project in the Web References folder. The folder name will be Web References (see figure 1) and a namespace, representing the Web Service host will be added to that namespace. There will be three files with the extensions .map, .disco, and .wsdl. Collectively, this information points at our Web Service. There is one other file that was added to the Web References folder that doesn't show up in the Server Explorer, Reference.vb. Reference.vb contains a proxy class that inherits from System.Web.Services.Protocols.SoapHttpClientProtocol; this class is a proxy-or wrapper-for the Web Service. The proxy class is generated using the .NET CodeDOM technology and is responsible for marshalling calls between your application and the Web Service, making Web Services easier to use. Tip: To obtain a Web Service description you can type the URL followed by the query WSDL. For example, on my machine I can obtain a Web Service description of the Primes service by typing http://localhost/primes/service1.asmx?wsdl in the Address bar of Internet Explorer. Importantly, the proxy class contains three methods for every Web Method. One is a proxy for the synchronous version of the Web Method, and the other two are proxy methods for the SoapHttpClientProtocol.BeginInvoke and SoapHttpClientProtocol.EndInvoke. That is, the second pair of methods represents proxies for asynchronous invocation of the Web Service. Invoking a Web Method Asynchronously We can figure out how to invoke the Web Service asynchronously by examining the proxy methods. Listing 1 shows the proxy methods for the Web Method IsPrime. Listing 1: Asynchronous proxy methods for the Web Method IsPrime. Public Function BeginIsPrime(ByVal number As Long, _ ByVal callback As System.AsyncCallback, _ ByVal asyncState As Object) As System.IAsyncResult Return Me.BeginInvoke("IsPrime", New Object() {number}, _ callback, asyncState) End Function Public Function EndIsPrime( _ ByVal asyncResult As System.IAsyncResult) As Boolean Dim results() As Object = Me.EndInvoke(asyncResult) Return CType(results(0),Boolean) End Function

As the name suggests we call BeginIsPrime to initiate the asynchronous call. The proxy for BeginInvoke is a function that returns an interface IAsyncResult. The return value is used to synchronize interaction between the client and the Web Service. The first parameter is the value we pass to the Web Service; in this instance it is the number that we want to check for prime-ness. The second parameter is the callback. The second parameter will be the address of the method we want the Web Service to invoke when the Web Method has finished processing. The type of the callback method is the delegate AsyncCallback. The third argument is any additional object we want to pass through to the Web Service and the callback method. The third parameter can be used for any additional information, including simple data or objects. The second method is called when the Web Service is ready or to block in the client until the Web Service is ready. For example, you can call the EndInvoke proxy in the callback method when the Web Service calls it. The callback is defined such that it accepts, and will receive, an IAsyncResult argument that you pass back to the EndInvoke proxy. The IAsyncResult object is used to synchronize the data exchange between the client and Web Service. Listing 2 provides a slim example that combines all of the elements together. After the listing is an overview of the code as I wrote it. Listing 2: Invoking a Web Method asynchronously. 1: Imports System.Console 2: Imports System.Threading 3: 4: Public Class Form1 5: Inherits System.Windows.Forms.Form 6: 7: [ Windows Form Designer generated code ] 8: 9: Private Sub Button1_Click(ByVal sender As System.Object, _ 10: ByVal e As System.EventArgs) Handles Button1.Click 11: 12: ListBox1.Items.Clear() 13: Start() 14: End Sub 15: 16: Private Service As localhost.Service1 = _ 17: New localhost.Service1() 18: Private Sub Start() 19: 20: Dim Numbers() As Long = _ 21: New Long() {103323, 2, 3, 56771, 7} 22: Dim Number As Long 23:

24: For Each Number In Numbers 25: Dim Result As IAsyncResult = _ 26: Service.BeginIsPrime(Number, _ 27: AddressOf Responder, Number) 28: Next 29: 30: End Sub 31: 32: Private Sub Responder(ByVal Result As IAsyncResult) 33: 34: Dim IsPrime As Boolean = Service.EndIsPrime(Result) 35: 36: If (InvokeRequired) Then 37: Invoke(New MyDelegate(AddressOf AddToList), _ 38: New Object() {IsPrime, _ 39: CType(Result.AsyncState, Long)}) 40: End If 41: 42: End Sub 43: 44: Private Delegate Sub MyDelegate( _ 45: ByVal IsPrime As Boolean, ByVal Number As Long) 46: 47: Private Sub AddToList(_ 48: ByVal IsPrime As Boolean, ByVal Number As Long) 49: 50: Const Mask As String = _ 51: "{0} {1} a prime number" 52: 53: Dim Filler() As String = New String() {"is not", "is"} 54: ListBox1.Items.Add( _ 55: String.Format(Mask, Number, _ 56: Filler(Convert.ToInt16(IsPrime)))) 57: 58: End Sub 59: 60: End Class (The code generated by the designer is condensed-simulating Code Outlining in Visual Studio .NET-on line 7.) The basic idea is that the consumer sends several inquiries about possible prime numbers. Large prime numbers take longer to calculate than prime numbers; so the client application is designed to send every number asynchronously rather than get bogged down on big prime candidates. The process is initiated in the Button1_Click event on line 13 when Start is invoked. (The actual application sends the same numbers ever time, but you could easily make this

dynamic, too.) Start is defined on lines 18 through 30 in listing 1. An array of candidate numbers is created on lines 20 and 21, demonstrating inline initialization in Visual Basic .NET. As you can see the largest number is first. In a synchronous application the remaining numbers would wait in line until 103323 was evaluated. In our model all requests will be sent and the results displayed as they are available. The For Each loop manages sending every number to be processed, representing ongoing work while preceding requests are being serviced by the Web Service. The code we are interested in is on lines 25 through 27. Line 25 shows you how to obtain an IAsyncResult object in case we elect to block in the Start method. (We won't.) The first argument is the Number to be evaluated by the Web Method IsPrime; the second argument is the delegate, created implicitly with the AddressOf operator, and the third argument is the Number. I passed the Number a second time for display purposes (refer to line 55). The Web Service was created on lines 16 and 17, before the Form's constructor was called. The name localhost represents a namespace in this context and happens to be derived from the Web Service host computer. Retrieving the Results from the Web Method There are several ways to block while you are waiting for a Web Service to return. You can use the IAsyncResult.IsCompleted property in a loop, call Service.EndIsPrime-the EndInvoke proxy-or request theIAsyncResult.AsyncWaitHandle. In our example, we process merrily until the callback is invoked by the Web Service. The callback method is defined on lines 32 through 42. When the callback is called we can obtain the result by calling the EndInvoke proxy method as demonstrated on line 34. Lines 36 through 40 and 44 through 58 exist in this instance due to the kind of applicationa Windows Form application. When you invoke a Web Service asynchronously the callback method will be called back on a different thread than the one the Windows Forms controls reside on. As Windows Forms is not thread-safe-which means you should interact with Windows Forms controls on the same thread as the one they live on-we can use the Control.Invoke method and push the "work" onto the same thread that the control lives on. Again we use delegates to represent the work to be done. The method InvokeRequired can be used to determine if you need to call invoke, as demonstrated on line 36. Lines 37, 38, and 39 demonstrate the Invoke method. Define a new delegate based on the signature of the procedure you want to Invoke. Create an instance of that delegate type, initializing the delegate with the address of your work procedure. Pass an array of objects matching the parameters your work-method needs. The delegate is defined on lines 44 and 45. An instance of the delegate is created on line 37, and the array of arguments is demonstrated on lines 38 and 39. Lines 38 and 39 create an array of Object inline passing a Boolean and a Long as is expected by the AddToList method. Pay attention to the fact that the delegate signature, the procedure used to initialize the delegate, and the arguments passed to the delegate all of have identical footprints.

Summary Asynchronous Web Services depend on a lot of advanced aspects of the .NET framework, including SOAP, XML, HTTP, CodeDOM, TCP/IP, WDSL, UDDI, multithreading, and delegates, to name a view. Fortunately, these technologies exist already and work on our behalf behind the scenes for the most part. If you want to use asynchronous Web Services, the hardest thing you need to master are delegates. Don't let anyone trivialize Web Services. They are powerful and complicated, but the complicated part was codified by Microsoft. The end result is that Web Services are easy to consume, with only modest additional complexity to invoke them asynchronously. Asynchronous Web Services will add some zip to your applications. Be mindful of the existence of more than one thread and you are all set. Posted by NMK at 11:53 PM 0 comments

.NET Windows Services


Introduction Windows Services are long running executable applications that have no User Interface, can be configured to start automatically and can also be started manually. Windows services are not meant to interact with users and should not have a user interface. These applications are actually controlled by the Service Control Manager. This article discusses Windows Services and shows how we can implement a simple Windows Service in C#. What are Windows Services? Windows services are long running executable applications that typically do not possess any user interface, are controlled by the Service Control Manager (SCM) and can even be configured to start automatically after the system boots. They typically execute in their own windows sessions. They can execute even if the user has not logged in to the system. They can even be started, paused, re-started manually. These applications are somewhat similar to the daemon processes of UNIX in the sense that they remain dormant most of the time and execute in the background as and when needed. Why are Windows Services needed? The following are the benefits of using Windows Services: Network connection management Disk access monitoring Security control of application Log messages related to the application's requirements Anatomy of a Windows Service Application This section briefly discusses the anatomy of a Windows Service application. The .NET Framework's System.ServiceProcess.ServiceBase encapsulates the entire functionality

that is required to create and control Windows Service applications. The following two classes are required for implementing a Windows Service: System.ServiceProcess.ServiceBase System.Configuration.Install.Installer The ServiceBase class must be inherited by your Service class to specify your Service and the Installer class should be inherited in your Installer class to specify the Service installer. The following are the methods of ServiceBase class. OnStart OnStop OnPause OnContinue OnShutdown OnPowerEvent OnCustomCommand The following section discusses these methods briefly. OnStart: This method is fired when the service is started by the Service Control Manager. It should be noted that this method is called only once during the life cycle. This method is used to specify the processing that occurs when a Start command is received. OnStop: This method is called when the service is stopped by the Service Control Manager. This is typically used to specify the processing that occurs when a Stop command is received by the Service Control Manager. OnPause: This method is called when the service is paused and typically contains the processing for pausing the service. OnContinue: This method is called when the service is resumed after being paused. This method typically contains the necessary processing so as to enable a service to return to normal functioning after the same was paused earlier. OnShutDown: This method is called when the system is being shutdown and contains the necessary processing indicative of what should happen prior to the system shutting down. OnPowerEvent: This method is used to specify the necessary processing that should take place when the power status changes. OnCustomCommand: This method is used to specify a custom command, i.e., any command other than those discussed above.

In addition to the above methods, the System.ServiceProcess.ServiceBase class also contains the following properties: AutoLog CanPauseAndContinue CanShutdown CanStop ServiceName The following section discusses these properties briefly. CanStop: This is a boolean property that is true if the service can be stopped, false otherwise. CanShutdown: This is a boolean property that is true if the service wants to be notified that the system on which it is being executed is being shutdown, false otherwise. CanPauseAndContinue: This is a boolean property that is true if the service can be paused and then restarted, false otherwise. CanHandlePowerEvent: This is a boolean property that is set to true if the service should be notified of a change in the power status of the system on which the service is being executed. AutoLog: This is a boolean property that is set to true if the service should write events to the Application Event Log when any action is performed. Implementing a Simple Windows Service Application in .NET This section makes use of the concepts learned so far and shows how we can implement a simple Windows Service in .NET. Creating the Windows Service To create a new project in Visual Studio .NET 2003, select C# as the language of your choice and then select Windows Service as the project. Specify the name of the project and save the same. Note that when implementing a Windows Service, you should have two classes, one is the Service class and the other is the Service Controller class. Refer to the following listings that contain the source code for both the custom Service and the custom ServiceController classes. Listing 1: The Sample Windows Service Class using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess;

using System.IO; namespace SampleWindowsService { public class SampleWindowsService: System.ServiceProcess.ServiceBase { StreamWriter streamWriter; private System.ComponentModel.Container components = null; public SampleWindowsService() { InitializeComponent(); } static void Main() { System.ServiceProcess.ServiceBase[]ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new SampleWindowsService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } private void InitializeComponent() { components = new System.ComponentModel.Container(); this.ServiceName = "Sample Service"; } protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } protected override void OnStart(string[]args) { streamWriter = new StreamWriter(new FileStream(

"C:\\SampleWindowsServiceLogger.txt", System.IO.FileMode.Append)); this.streamWriter.WriteLine("Starting Sample Windows Service at " + DateTime.Now.ToString()); this.streamWriter.Flush(); this.streamWriter.Close(); } protected override void OnStop() { streamWriter = new StreamWriter(new FileStream( "C:\\SampleWindowsServiceLogger.txt", System.IO.FileMode.Append)); this.streamWriter.WriteLine("Stopping Sample Windows Service at " + DateTime.Now.ToString()); this.streamWriter.Flush(); this.streamWriter.Close(); } } } Listing 2: The Sample Windows Service Installer Class using System; using System.Collections; using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install; namespace SampleWindowsService { [RunInstaller(true)] public class SampleWindowsServiceInstaller: System.Configuration.Install.Installer { private System.ComponentModel.Container components = null; public SampleWindowsServiceInstaller() { InitializeComponent(); ServiceProcessInstaller spi = new ServiceProcessInstaller(); ServiceInstaller si = new ServiceInstaller(); si.DisplayName = "Sample Windows Service"; si.ServiceName = "Sample Windows Service"; si.StartType = ServiceStartMode.Automatic; this.Installers.Add(si); spi.Account = ServiceAccount.LocalSystem;

spi.Username = null; spi.Password = null; this.Installers.Add(spi); } protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } private void InitializeComponent() { components = new System.ComponentModel.Container(); } } } The Windows Service implemented in this article stores the time of starting, stopping or resuming the service in a file C:\\SampleWindowsServiceLogger.txt in the local file system. Make changes to implement the service that can suit your needs. Start, stop and resume the Windows Service Go to Control Panel | Administrative Tools | Computer Management and select the Services and Applications tab. Then locate your installed service and click on Start to start the service. The rest is self explanatory. Installing the Windows Service In order to install the Windows Service implemented above, use the installutil .NET Framework command line utility. Specify the following at the command prompt. Installutil SampleWindowsServiceInstaller.exe Un-Installing the Windows Service In order to uninstall the Windows service, specify the following at the command prompt: Installutil /u SampleWindowsServiceInstaller.exe Important Points You should note that a Microsoft .NET service will not start if the application event log is full. Hence, it is recommended to clear the event log down and set to overwrite as needed. Remember inheriting the ServiceBase class to create you Service class and the

System.Configuration.Install.Installer class when implementing your Service Controller class. ---------------------- Part II ----------------------Windows Services Defined Every time a user logs on the NT machine, a desktop is immediately assigned to him. Any process or thread started by the user is attached to this desktop. Multiple desktops can exist, but only one desktop can be active at a time. These desktops each have threads assigned to them. Windows can be created in each of these threads, but only those windows in threads assigned to the active desktop are visible. Windows services are processes that exist without any desktops and run in the background (similar to daemon processes in UNIX). They can be started before any user logs into the system. After the operating system is initially loaded, it immediately begins loading the services that are configured to automatically start. The user can log on to the system before all automatic services are loaded, but the user is not presented with a desktop until all the automatic services have finished loading. After logging on, the user can start and stop the services. When the user logs off, the desktop is closed and all the processes assigned to his desktop are also closed. But any services that exist when the user logs off are not closed and remain alive and running. They are often loaded at boot up, before any user logs in, and are often independent of any specific user logged on at the time. In fact, a service has its own login session. A service can also be launched manually by a user. Although its possible, Windows Service typically has no user interface. The Need for Windows Services The fact that services can exist without desktops is the advantage that makes services desirable. The various situations during which a process is installed as a service are: When a process is needed that starts when the computer starts and stops only when computer stops Hardware drivers, or applications controlling or monitoring hardware attached to a system; e.g. monitoring for plug and play devices A process is required that operates even when no users are logged on to the computer; e.g. Anti Virus programs, Disk Monitoring programs etc. Parts of Operating System itself; e.g. RPC (Remote Procedure Call) server, DCOM (Distributed Component Object Model) server, etc. Software which handles communication from users on other machines, who have logged on to this machine; e.g. FTP Server, Web Server etc. Service Control Manager (SCM) Due to the fact that services have no desktops, they usually do not interact with the users. But there has to be a way for controlling and managing these services. Service Control Manager does just that. The SCM, a part of the windows kernel, is the one that controls the lifetime of the

service. Any process that needs to be started and stopped like a service has to register itself with the SCM. The SCM then takes care of when to launch the service and when to stop it. The SCM holds a list of all the installed services, when they should be started, whether they should be allowed to interact with the desktop, etc. The administrator can control services by sending control requests to them (e.g. "start service", "stop service", etc.) via the SCM. This is done using the Services applet of the control panel; double-clicking on the icon brings up the Services window, which lists all the services in the SCM database. Another utility to view the services running is WinMsd.exe. Combining the functionalities available in these two utilities, with an additional capability to control and configure the services on remote computers is Service Controller (SC.exe). This utility is not pre-installed with windows and has to be downloaded to every computer that needs it. All these utilities use the SCM to communicate with the services. The SCM maintains its database of services installed in the system in the registry. Each service has an entry in the following key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ Here, the Service Name is the name of the service used by the SCM. The service name seen in the Services applet is different from this one. This is a unique name used internally by the SCM. The corresponding name of each service which is displayed in the applet is stored in the key Display Name inside the Service Name key. Each service can run by logging on as either a Local System or particular user account. Also the services can be enabled or disabled for specific hardware profile. Each service could either run independently or it will depend on some other service(s). The list of services each service depends on will be maintained by the SCM. All these information could be seen from the Services applet by looking at the properties of each service. Other than the list of services a particular service depends on, a list of services that depend on this service can also be seen. When a service fails, the SCM can decide what action to take. These can be specified directly through the Service applet. The possible actions are: Restart the service Run a particular file Reboot the computer Take no action By default the response for a failure is to take no action. If the service fails for the second time too, one of these actions can be set. For subsequent failures, another action could be assigned. Building a service is a little complicated in the sense that a certain steps have to be

followed to successfully build and install a service. Prior to .NET, the only efficient way to build a .NET was by building it in C++/ VC++. It was complicated and had various issues to be considered while doing it. But .NET has changed the way the services were build. With its Framework Base Classes available as a part of the .NET Framework, building services were made easy. By taking advantage of the object oriented capability of .NET, various tasks needed to build a service has been greatly simplified by encapsulating them inside various classes and including them as a part of the .NET Framework Base Classes. These base classes in the .NET Framework take care of the system-level interfacing .NET Approach to Windows Services When .NET is used to create services, the steps involved in doing it are reduced. Much of the functionalities and system level interactions are wrapped inside classes and available as a part of the Framework Base Classes. Any .NET language can be used to create Windows Services. Two base classes needed for creating the Windows Services are System.ServiceProcess.ServiceBase System.Configuration.Install.Installer System.ServiceProcess.ServiceBase provides the base class for the service itself. The class that inherits from this class contains the logic that runs in the service. System.Configuration.Install.Installer provides the interface necessary to get the service installed under Windows 2000 and NT. It isn't typically necessary to put any logic in the installer class. There can be more than one service in a project. The installer class creates one ServiceProcessInstaller object (which knows how to install the service with the SCM), and a ServiceInstaller object. The ServiceInstaller object writes information to the registry which is needed for installation. A subkey is added under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ In VB.NET, any project created as a service will automatically create a class that inherits from the System.ServiceProcess.ServiceBase class. But the installer class has to be included manually. A Windows Service has a special installation procedure that handles all the operating-system communications necessary to execute a service. A special command-line program in .NET named InstallUtil.exe installs and uninstalls Windows Services produced in .NET. In VB.NET, the steps that are followed to develop a Windows Service are: 1. Create Windows Service project in Visual Basic.NET 2. Add installer to project 3. Add/change logic and build the executable for the service 4. Install the service using InstallUtil.exe 5. Start the service using the Service applet in the Control Panel The same applet can be used to stop the service. The InstallUtil.exe can be used again to uninstall the service. This is done by passing the /u attribute

Building Windows Services A windows service exists as an executable file and may contain more than one service. The behavior of each of the service is defined by writing a class for each that inherits from the ServiceProcess.ServiceBase class and code can be added to handle various methods provided by this class. The service can provide code for OnStart, OnStop, OnPause, OnContinue, and OnShutdown methods called by the SCM as a user interacts with the service. None of these procedures are required, but they can be used to provide specific behavior in reaction to requests from the SCMs user interface, or programmatically from other services. The steps to be taken to create windows services under .NET: 1. Create a new project in .NET by choosing the Windows Services template. The project can either be VB.NET or C#. 2. A class named Service1 will be created. Open the class in design view. This can be done either by pressing Shift+F7 or choose View | Designer menu item. 3. The properties could be set as necessary. The three Boolean properties CanPauseAndContinue, CanShutDown, and CanStop- control the behavior of the service. 4. Add startup code. The services OnStart event can be used to set up the service and data structures used, and perhaps log information to the event log. Also code to handle the OnContinue, OnCustomCommand, OnPause, OnShutdown, and OnStop events. Add an Installer. This can be done by going to the service classs design view as done in step 2. Now, clicking on the Add Installer will add the installer classes. Once the Installer class has been added, Visual Studio .NET creates a new project file named ProjectInstaller.cs. This file contains two components: ServiceProcessInstaller1 and ServiceInstaller1. The properties of the ServiceInstaller1 class will show the service name in ServiceName property as Service1. The ServiceProcessInstaller1 has properties such as UserName and Password as shown in fig 2.0. They will be by default set to Nothing. For the installer to be able to install the service, the account information should be supplied. For a simple service the account property of the ServiceProcessInstaller1 could be set to LocalSystem. The ServiceName property of the ServiceInstaller object should be the same name as that of the service class. Installing Windows Services Once the steps needed to build the service is over, it should be installed. Following are the steps to do it. 1. Save the project. 2. Build the services executable file. Build | Build menu item. 3. Open the Visual Studio .NET Command Prompt item from the start menu. It will be

installed as a subitem of the Visual Studio .NET Tools item. This shortcut sets all the path necessary before going to the DOS prompt. Change the folder to the location where the executable is located. It will be found in the bin folder within the folder where the project is stored. 4. Install the service. This can be done by using the InstallUtil tool that comes with the Visual Studio. Use the following command line: InstallUtil Service1.exe

5 .Start the service. This can be done by running the Windows Service Manager. In the services list, the service now installed will be listed as Service1. Right click and start the service. 6. Now, any Startup events can be viewed by opening the Event Viewer. Select the Application log, and any entries send to the log can be seen there.

Removing and Debugging Windows Services Removing Removing the service can be done by running the same InstallUtil tool but with a /u parameter. This will uninstall the service. The entry in the Windows Service Manager will be removed. Debugging Because a service has to be compiled and installed before running it, debugging becomes a little more complex than the normal applications. To debug a service, we have to run it and debug the running process. The steps to follow: 1. Install the service and run it. 2. In Visual Studio, select Debug | Processes menu item. Processes dialog box is displayed. 3. Select the Show system processes check box to include the running services. 4. Select the Service1 entry and click Attach. Click OK to accept. Close Processes dialog box. 5. Set the breakpoint in the code at the location to be tested. 6. Trigger the breakpoint by taking necessary action. For example, if the breakpoint is in the OnStop procedure, stop the processes to invoke it. Now single stepping can be done. To continue F5 should be pressed. 7. Then after the debugging is finished, detach the process by using the Debug | Processes menu. Select the service and click Detach. Use the Debug | Stop Debugging menu item to stop debugging session.

Example As a simple example, the following code can be used to test a service. Once the steps are followed to create a service, procedures for handling the start and stop event of the service is automatically created. These events can be tested by putting a log entry. The code might look like this: For C# project: protected override void OnStart(string[] args) { EventLog.WriteEntry( String.Format("Process Starting") ); } For Visual Basic project: Protected Overrides Sub OnStart(ByVal args() As String) EventLog.WriteEntry( String.Format("Process Starting")) End Sub The logged entry can be viewed from the Event Viewer applet. Various Classes Available in .NET to Deal with Windows Services The System.ServiceProcess namespace provides classes that allow you to implement, install, and control Windows service applications. The various classes available within this namespace are: Classes Class & Description ServiceBase Provides a base class for a service that will exist as part of a service application. ServiceBase must be derived when creating a new service class. ServiceController Represents a Windows service and allows you to connect to a running or stopped service, manipulate it, or get information about it. ServiceControllerPermission Allows control of code access security permissions for service controllers. ServiceControllerPermissionAttribute Allows declarative service controller permission checks. ServiceControllerPermissionEntry Defines the smallest unit of a code access security permission that is set for a ServiceController. ServiceControllerPermissionEntryCollection Contains a strongly-typed collection of ServiceControllerPermissionEntry objects. ServiceInstaller Installs a class that extends ServiceBase to implement a service. This class is called by the install utility when installing a service application.

ServiceProcessDescriptionAttribute Specifies a description for a property or event. ServiceProcessInstaller Installs an executable containing classes that extend ServiceBase. This class is called by installation utilities, such as InstallUtil.exe, when installing a service application. TimeoutException The exception that is thrown when a specified timeout has expired. Enumerations Enumeration & Description PowerBroadcastStatus Indicates the system's power status. ServiceAccount Specifies a service's security context, which defines its logon type. ServiceControllerPermissionAccess Defines access levels used by ServiceController permission classes. ServiceControllerStatus Indicates the current state of the service. ServiceStartMode Indicates the start mode of the service. ServiceType Represents the type of the service. Conclusion By taking advantage of the Framework Base Classes, the complexity needed to create a service is greatly reduced. This lets the developer to concentrate more on the functionality of the service instead of spending time in creating it. Posted by NMK at 3:08 AM

www.braindotnet.blogspot.com *********************************************************************** *******************************************

Other Important Questions - miscellaneous


What does assert() method do? In debug compilation, assert takes in a Boolean condition as a parameter, and shows the error dialog if the condition is false. The program proceeds without any interruption if the condition is true.

What's the difference between the Debug class and Trace class? Documentation looks the same. Use Debug class for debug builds, use Trace class for both debug and release builds. Why are there five tracing levels in System.Diagnostics.TraceSwitcher? The tracing dumps can be quite verbose. For applications that are constantly running you run the risk of overloading the machine and the hard drive. Five levels range from None to Verbose, allowing you to fine-tune the tracing activities. Where is the output of TextWriterTraceListener redirected? To the Console or a text file depending on the parameter passed to the constructor. When was the first version of .NET released? The final version of the 1.0 SDK and runtime was made publicly available around 6pm PST on 15-Jan-2002. At the same time, the final version of Visual Studio.NET was made available to MSDN subscribers. What is Partial Assembly References? Full Assembly reference: A full assembly reference includes the assembly's text name, version, culture, and public key token (if the assembly has a strong name). A full assembly reference is required if you reference any assembly that is part of the common language runtime or any assembly located in the global assembly cache. Partial Assembly reference: We can dynamically reference an assembly by providing only partial information, such as specifying only the assembly name. When you specify a partial assembly reference, the runtime looks for the assembly only in the application directory. We can make partial references to an assembly in your code one of the following ways: -> Use a method such as System.Reflection.Assembly.Load and specify only a partial reference. The runtime checks for the assembly in the application directory. -> Use the System.Reflection.Assembly.LoadWithPartialName method and specify only a partial reference. The runtime checks for the assembly in the application directory and in the global assembly cache Changes to which portion of version number indicates an incompatible change? Major or minor. Changes to the major or minor portion of the version number indicate an incompatible change. Under this convention then, version 2.0.0.0 would be considered incompatible with version 1.0.0.0. Examples of an incompatible change would be a change to the types of some method parameters or the removal of a type or method altogether. Build. The Build number is typically used to distinguish between daily builds or smaller compatible releases. Revision. Changes to the revision number are typically reserved for an incremental build needed to fix a particular bug. You'll sometimes hear

this referred to as the "emergency bug fix" number in that the revision is what is often changed when a fix to a specific bug is shipped to a customer. How does CAS work? The CAS security policy revolves around two key concepts - code groups and permissions. Each .NET assembly is a member of a particular code group, and each code group is granted the permissions specified in a named permission set. For example, using the default security policy, a control downloaded from a web site belongs to the 'Zone - Internet' code group, which adheres to the permissions defined by the 'Internet' named permission set. (Naturally the 'Internet' named permission set represents a very restrictive range of permissions.) Who defines the CAS code groups? Microsoft defines some default ones, but you can modify these and even create your own. To see the code groups defined on your system, run 'caspol -lg' from the command-line. On my system it looks like this: Level = Machine Code Groups: 1. All code: Nothing 1.1. Zone - MyComputer: FullTrust 1.1.1. Honor SkipVerification requests: SkipVerification 1.2. Zone - Intranet: LocalIntranet 1.3. Zone - Internet: Internet 1.4. Zone - Untrusted: Nothing 1.5. Zone - Trusted: Internet 1.6. StrongName 0024000004800000940000000602000000240000525341310004000003 000000CFCB3291AA715FE99D40D49040336F9056D7886FED46775BC7BB5430BA4 444FEF8348EBD06 F962F39776AE4DC3B7B04A7FE6F49F25F740423EBF2C0B89698D8D08AC48D69C ED0FC8F83B465E08 07AC11EC1DCC7D054E807A43336DDE408A5393A48556123272CEEEE72F1660B7 1927D38561AABF5C AC1DF1734633C602F8F2D5: Note the hierarchy of code groups - the top of the hierarchy is the most general ('All code'), which is then sub-divided into several groups, each of which in turn can be subdivided. Also note that (somewhat counter-intuitively) a sub-group can be associated with a more permissive permission set than its parent. How do I define my own code group? Use caspol. For example, suppose you trust code from www.mydomain.com and you want it have full access to your system, but you want to keep the default restrictions for all other internet sites. To achieve this, you would add a new code group as a sub-group of the 'Zone - Internet' group, like this:

caspol -ag 1.3 -site www.mydomain.com FullTrust Now if you run caspol -lg you will see that the new group has been added as group 1.3.1: 1.3. Zone - Internet: Internet 1.3.1. Site - www.mydomain.com: FullTrust Note that the numeric label (1.3.1) is just a caspol invention to make the code groups easy to manipulate from the command-line. The underlying runtime never sees it. How do I change the permission set for a code group? Use caspol. If you are the machine administrator, you can operate at the 'machine' level which means not only that the changes you make become the default for the machine, but also that users cannot change the permissions to be more permissive. If you are a normal (non-admin) user you can still modify the permissions, but only to make them more restrictive. For example, to allow intranet code to do what it likes you might do this: caspol -cg 1.2 FullTrust Note that because this is more permissive than the default policy (on a standard system), you should only do this at the machine level - doing it at the user level will have no effect. I can't be bothered with all this CAS stuff. Can I turn it off? Yes, as long as you are an administrator. Just run: caspol -s off Is there built-in support for tracing/logging? Yes, in the System.Diagnostics namespace. There are two main classes that deal with tracing - Debug and Trace. They both work in a similar way - the difference is that tracing from the Debug class only works in builds that have the DEBUG symbol defined, whereas tracing from the Trace class only works in builds that have the TRACE symbol defined. Typically this means that you should use System.Diagnostics.Trace.WriteLine for tracing that you want to work in debug and release builds, and System.Diagnostics.Debug.WriteLine for tracing that you want to work only in debug builds. Can I redirect tracing to a file? Yes. The Debug and Trace classes both have a Listeners property, which is a collection of sinks that receive the tracing that you send via Debug.WriteLine and Trace.WriteLine respectively. By default the Listeners collection contains a single sink, which is an instance of the DefaultTraceListener class. This sends output to the Win32 OutputDebugString() function and also the System.Diagnostics.Debugger.Log() method. This is useful when debugging, but if you're trying to trace a problem at a customer site, redirecting the output to a file is more appropriate. Fortunately, the TextWriterTraceListener class is provided for this purpose. What's a satellite assembly?

When you write a multilingual or multi-cultural application in .NET, and want to distribute the core application separately from the localized modules, the localized assemblies that modify the core application are called satellite assemblies. What namespaces are necessary to create a localized application? System.Globalization, System.Resources. What does assert() do? In debug compilation, assert takes in a Boolean condition as a parameter, and shows the error dialog if the condition is false. The program proceeds without any interruption if the condition is true. What's the difference between the Debug class and Trace class? Documentation looks the same. Use Debug class for debug builds, use Trace class for both debug and release builds. Why are there five tracing levels in System.Diagnostics.TraceSwitcher? The tracing dumps can be quite verbose and for some applications that are constantly running you run the risk of overloading the machine and the hard drive there. Five levels range from None to Verbose, allowing to fine-tune the tracing activities. Where is the output of TextWriterTraceListener redirected? To the Console or a text file depending on the parameter passed to the constructor. What is portable executable (PE) ? The file format used for executable programs and for files to be linked together to form executable programs Different b/w .NET & J2EE? Differences between J2EE and the .NET Platform Vendor Neutrality The .NET platform is not vendor neutral, it is tied to the Microsoft operating systems. But neither are any of the J2EE implementations Many companies buy into J2EE believing that it will give them vendor neutrality. And, in fact, this is a stated goal of Sun's vision: A wide variety of J2EE product configurations and implementations, all of which meet the requirements of this specification, are possible. A portable J2EE application will function correctly when successfully deployed in any of these products. (ref : Java 2 Platform Enterprise Edition Specification, v1.3, page 2-7 available at http://java.sun.com/j2ee/) Overall Maturity Given that the .NET platform has a three year lead over J2EE, it should be no surprise to learn that the .NET platform is far more mature than the J2EE platform. Whereas we have high volume highly reliable web sites using .NET technologies (NASDAQ and Dell

being among many examples) Interoperability and Web Services The .NET platform eCollaboration model is, as I have discussed at length, based on the UDDI and SOAP standards. These standards are widely supported by more than 100 companies. Microsoft, along with IBM and Ariba, are the leaders in this area. Sun is a member of the UDDI consortium and recognizes the importance of the UDDI standards. In a recent press release, Sun's George Paolini, Vice President for the Java Community Development, says: "Sun has always worked to help establish and support open, standards-based technologies that facilitate the growth of network-based applications, and we see UDDI as an important project to establish a registry framework for business-tobusiness e-commerce. But while Sun publicly says it believes in the UDDI standards, in reality, Sun has done nothing whatsoever to incorporate any of the UDDI standards into J2EE. Scalability Typical Comparision w.r.t Systems and their costs J2EE Company System Total Sys. Cost Bull Escala T610 c/s 16,785 $1,980,179 IBM RS/6000 Enterprise Server F80 16,785 $2,026,681 Bull Escala EPC810 c/s 33,375 $3,037,499 IBM RS/6000 Enterprise Server M80 33,375 $3,097,055 Bull Escala EPC2450 110,403 $9,563,263 IBM IBM eServer pSeries 680 Model 7017-S85 110,403 $9,560,594 .NET platform systems Company System Total Sys. Dell PowerEdge 4400 Compaq ProLiant ML-570-6/700-3P Dell IBM Compaq Compaq Compaq Compaq Compaq PowerEdge 6400 Netfinity 7600 c/s ProLiant 8500-X550-64P ProLiant 8500-X700-64P ProLiant 8500-X550-96P ProLiant 8500-X700-96P ProLiant 8500-700-192P Cost 16,263 $273,487 20,207 $201,717 30,231 $334,626 32,377 $443,463 161,720 $3,534,272 179,658 $3,546,582 229,914 $5,305,571 262,244 $5,305,571 505,303 $10,003,826

Framework Support The .NET platform includes such an eCommerce framework called Commerce Server. At this point, there is no equivalent vendor-neutral framework in the J2EE space. With

J2EE, you should assume that you will be building your new eCommerce solution from scratch Moreover, no matter what [J2EE] vendor you choose, if you expect a component framework that will allow you to quickly field complete e-business applications, you are in for a frustrating experience Language In the language arena, the choice is about as simple as it gets. J2EE supports Java, and only Java. It will not support any other language in the foreseeable future. The .NET platform supports every language except Java (although it does support a language that is syntactically and functionally equivalent to Java, C#). In fact, given the importance of the .NET platform as a language independent vehicle, it is likely that any language that comes out in the near future will include support for the .NET platform. Some companies are under the impression that J2EE supports other languages. Although both IBM's WebSphere and BEA's WebLogic support other languages, neither does it through their J2EE technology. There are only two official ways in the J2EE platform to access other languages, one through the Java Native Interface and the other through CORBA interoperability. Sun recommends the later approach. As Sun's Distinguished Scientist and Java Architect Rick Cattell said in a recent interview. Portability The reason that operating system portability is a possibility with J2EE is not so much because of any inherent portability of J2EE, as it is that most of the J2EE vendors support multiple operating systems. Therefore as long as one sticks with a given J2EE vendor and a given database vendor, moving from one operating system to another should be possible. This is probably the single most important benefit in favor of J2EE over the .NET platform, which is limited to the Windows operating system. It is worth noting, however, that Microsoft has submitted the specifications for C# and a subset of the .NET Framework (called the common language infrastructure) to ECMA, the group that standardizes JavaScript. J2EE offers an acceptable solution to ISVs when the product must be marketed to nonWindows customers, particularly when the J2EE platform itself can be bundled with the ISV's product as an integrated offering. If the primary customer base for the ISV is Windows customers, then the .NET platform should be chosen. It will provide much better performance at a much lower cost. Client device independence The major difference being that with Java, it is the presentation tier programmer that determines the ultimate HTML that will be delivered to the client, and with .NET, it is a Visual Studio.NET control. This Java approach has three problems. First, it requires a lot of code on the presentation tier, since every possible thin client system requires a different code path. Second, it is very difficult to test the code with every possible thin client system. Third, it is very difficult to add new thin clients to an existing application, since to do so involves searching through, and modifying a tremendous amount of presentation tier logic. The .NET Framework approach is to write device independent code that interacts with

visual controls. It is the control, not the programmer, that is responsible for determining what HTML to deliver, based on the capabilities of the client device.. In the .NET Framework model, one can forget that such a thing as HTML even exists! Conclusion Sun's J2EE vision is based on a family of specifications that can be implemented by many vendors. It is open in the sense that any company can license and implement the technology, but closed in the sense that it is controlled by a single vendor, and a self contained architectural island with very limited ability to interact outside of itself. One of J2EE's major disadvantages is that the choice of the platform dictates the use of a single programming language, and a programming language that is not well suited for most businesses. One of J2EE's major advantages is that most of the J2EE vendors do offer operating system portability. Microsoft's .NET platform vision is a family of products rather than specifications, with specifications used primarily to define points of interoperability. The major disadvantage of this approach is that if is limited to the Windows platform, so applications written for the .NET platform can only be run on .NET platforms. Their are several important advantages to the .NET platform: * The cost of developing applications is much lower, since standard business languages can be used and device independent presentation tier logic can be written. * The cost of running applications is much lower, since commodity hardware platforms (at 1/5 the cost of their Unix counterparts) can be used. * The ability to scale up is much greater, with the proved ability to support at least ten times the number of clients any J2EE platform has shown itself able to support. * Interoperability is much stronger, with industry standard eCollaboration built into the platform. Which are the abstract classes available under system.xml namespace? The System.XML namespace provides XML related processing ability in .NET framework. XmlReader and XMLWriter are the two abstract classes at the core of .NET Framework XML classes: 1. XmlReader provides a fast, forward-only, read-only cursor for processing an XML document stream. 2. XmlWriter provides an interface for producing XML document streams that conform to the W3C's XML standards. Both XmlReader and XmlWriter are abstract base classes, which define the functionality that all derived classes must support. What is Globalizationa and Localization ? Globalization is the process of creating an application that meets the needs of users from multiple cultures. It includes using the correct currency, date and time format, calendar, writing direction, sorting rules, and other issues. Accommodating these cultural differences in an application is called localization.Using classes of System.Globalization namespace, you can set application's current culture. This can be achieved by using any of the following 3 approaches. 1. Detect and redirect 2. Run-time adjustment 3. Using Satellite assemblies.

What are Resource Files ? How are they used in .NET? Resource files are the files containing data that is logically deployed with an application.These files can contain data in a number of formats including strings, images and persisted objects. It has the main advantage of If we store data in these files then we don't need to compile these if the data get changed. In .NET we basically require them storing culture specific informations by localizing application's resources. You can deploy your resources using satellite assemblies. What is GUID and why we need to use it and in what condition? How this is created. A GUID is a 128-bit integer (16 bytes) that can be used across all computers and networks wherever a unique identifier is required. Such an identifier has a very low probability of being duplicated. Visual Studio .NET IDE has a utility under the tools menu to generate GUIDs. What is GUID , why we use it and where? GUID :-- GUID is Short form of Globally Unique Identifier, a unique 128-bit number that is produced by the Windows OS or by some Windows applications to identify a particular component, application, file, database entry, and/or user. For instance, a Web site may generate a GUID and assign it to a user's browser to record and track the session. A GUID is also used in a Windows registry to identify COM DLLs. Knowing where to look in the registry and having the correct GUID yields a lot information about a COM object (i.e., information in the type library, its physical location, etc.). Windows also identifies user accounts by a username (computer/domain and username) and assigns it a GUID. Some database administrators even will use GUIDs as primary key values in databases. GUIDs can be created in a number of ways, but usually they are a combination of a few unique settings based on specific point in time (e.g., an IP address, network MAC address, clock date/time, etc.). What is inline schema, how does it works? Schemas can be included inside of XML file is called Inline Schemas.This is useful when it is inconvenient to physically seprate the schema and the XML document.A schema is an XML document that defines the structure, constraints, data types, and relationships of the elements that constitute the data contained inside the XML document or in another XML document.Schema can be an external file which uses the XSD or XDR extension called external schema. Inline schema can take place even when validation is turned off. Describe the advantages of writing a managed code application instead of unmanaged one. What's involved in certain piece of code being managed? "Advantage includes automatic garbage collection,memory management,security,type checking,versioning Managed code is compiled for the .NET run-time environment. It runs in the Common Language Runtime (CLR), which is the heart of the .NET Framework. The CLR provides

services such as security, memory management, and cross-language integration. Managed applications written to take advantage of the features of the CLR perform more efficiently and safely, and take better advantage of developers existing expertise in languages that support the .NET Framework. Unmanaged code includes all code written before the .NET Framework was introduced this includes code written to use COM, native Win32, and Visual Basic 6. Because it does not run inside the .NET environment, unmanaged code cannot make use of any .NET managed facilities." What are PDBs? Where must they be located for debugging to work? A program database (PDB) files holds debugging and project state information that allows incremental linking of debug configuration of your program.There are several different types of symbolic debugging information. The default type for Microsoft compiler is the so-called PDB file. The compiler setting for creating this file is /Zi, or /ZI for C/C++(which creates a PDB file with additional information that enables a feature called ""Edit and Continue"") or a Visual Basic/C#/JScript .NET program with /debug. A PDB file is a separate file, placed by default in the Debug project subdirectory, that has the same name as the executable file with the extension .pdb. Note that the Visual C++ compiler by default creates an additional PDB file called VC60.pdb for VisulaC++6.0 and VC70.PDB file for VisulaC++7.0. The compiler creates this file during compilation of the source code, when the compiler isn't aware of the final name of the executable. The linker can merge this temporary PDB file into the main one if you tell it to, but it won't do it by default. The PDB file can be useful to display the detailed stack trace with source files and line numbers. What is FullTrust? Do GACed assemblies have FullTrust? Before the .NET Framework existed, Windows had two levels of trust for downloaded code. This old model was a binary trust model. You only had two choices: Full Trust, and No Trust. The code could either do anything you could do, or it wouldn't run at all. The permission sets in .NET include FullTrust, SkipVerification, Execution, Nothing, LocalIntranet, Internet and Everything. Full Trust Grants unrestricted permissions to system resources. Fully trusted code run by a normal, nonprivileged user cannot do administrative tasks, but can access any resources the user can access, and do anything the user can do. From a security standpoint, you can think of fully trusted code as being similar to native, unmanaged code, like a traditional ActiveX control. GAC assemblies are granted FullTrust. In v1.0 and 1.1, the fact that assemblies in the GAC seem to always get a FullTrust grant is actually a side effect of the fact that the GAC lives on the local machine. If anyone were to lock down the security policy by changing the grant set of the local machine to something less than FullTrust, and if your assembly did not get extra permission from some other code group, it would no longer have FullTrust even though it lives in the GAC. What does this do? gacutil /l | find /i "Corillian"

The Global Assembly Cache tool allows you to view and manipulate the contents of the global assembly cache and download cache.The tool comes with various optional params to do that. ""/l"" option Lists the contents of the global assembly cache. If you specify the assemblyName parameter(/l [assemblyName]), the tool lists only the assemblies matching that name. What does this do .. sn -t foo.dll ? Sn -t option displays the token for the public key stored in infile. The contents of infile must be previously generated using -p. Sn.exe computes the token using a hash function from the public key. To save space, the common language runtime stores public key tokens in the manifest as part of a reference to another assembly when it records a dependency to an assembly that has a strong name. The -tp option displays the public key in addition to the token. How do you generate a strong name? .NET provides an utility called strong name tool. You can run this toolfrom the VS.NET command prompt to generate a strong name with an option "-k" and providing the strong key file name. i.e. sn- -k < file-name > What is the difference between a Debug and Release build? Is there a significant speed difference? Why or why not? The Debug build is the program compiled with full symbolic debug information and no optimization. The Release build is the program compiled employing optimization and contains no symbolic debug information. These settings can be changed as per need from Project Configuration properties. The release runs faster since it does not have any debug symbols and is optimized. What is strong-typing versus weak-typing? Which is preferred? Why? Strong typing implies that the types of variables involved in operations are associated to the variable, checked at compile-time, and require explicit conversion; weak typing implies that they are associated to the value, checked at run-time, and are implicitly converted as required. (Which is preferred is a disputable point, but I personally prefer strong typing because I like my errors to be found as soon as possible.) Distributed Application Design: ASP.NET Web Services vs. .NET Remoting ASP.NET Web services favor the XML Schema type system, and provide a simple programming model with broad cross-platform reach. .NET Remoting favors the runtime type system, and provides a more complex programming model with much more limited reach. This essential difference is the primary factor in determining which technology to use. However, there are a wide range of other design factors, including transport protocols, host processes, security, performance, state management, and support for transactions to consider as well. Security Since ASP.NET Web services rely on HTTP, they integrate with the standard Internet

security infrastructure. ASP.NET leverages the security features available with IIS to provide strong support for standard HTTP authentication schemes including Basic, Digest, digital certificates, and even Microsoft .NET Passport. (You can also use Windows Integrated authentication, but only for clients in a trusted domain.) One advantage of using the available HTTP authentication schemes is that no code change is required in a Web service; IIS performs authentication before the ASP.NET Web services are called. ASP.NET also provides support for .NET Passport-based authentication and other custom authentication schemes. ASP.NET supports access control based on target URLs, and by integrating with the .NET code access security (CAS) infrastructure. SSL can be used to ensure private communication over the wire. Although these standard transport-level techniques to secure Web services are quite effective, they only go so far. In complex scenarios involving multiple Web services in different trust domains, you have to build custom ad hoc solutions. Microsoft and others are working on a set of security specifications that build on the extensibility of SOAP messages to offer message-level security capabilities. One of these is the XML Web Services Security Language (WS-Security), which defines a framework for message-level credential transfer, message integrity, and message confidentiality. As noted in the previous section, the .NET Remoting plumbing does not secure crossprocess invocations in the general case. A .NET Remoting endpoint hosted in IIS with ASP.NET can leverage all the same security features available to ASP.NET Web services, including support for secure communication over the wire using SSL. If you are using the TCP channel or the HTTP channel hosted in processes other than aspnet_wp.exe, you have to implement authentication, authorization and privacy mechanisms yourself. One additional security concern is the ability to execute code from a semi-trusted environment without having to change the default security policy. ASP.NET Web Services client proxies work in these environments, but .NET Remoting proxies do not. In order to use a .NET Remoting proxy from a semi-trusted environment, you need a special serialization permission that is not given to code loaded from your intranet or the Internet by default. If you want to use a .NET Remoting client from within a semi-trusted environment, you have to alter the default security policy for code loaded from those zones. In situations where you are connecting to systems from clients running in a sandboxlike a downloaded Windows Forms application, for instanceASP.NET Web Services are a simpler choice because security policy changes are not required. What is the difference between XML Web Services using ASMX and .NET Remoting using SOAP? ASP.NET Web services and .NET Remoting provide a full suite of design options for cross-process and cross-plaform communication in distributed applications. In general, ASP.NET Web services provide the highest levels of interoperability with full support for WSDL and SOAP over HTTP, while .NET Remoting is designed for common language runtime type-system fidelity and supports additional data format and communication

channels. Hence if we looking cross-platform communication than web services is the choice coz for .NET remoting .Net framework is requried which may or may not present for the other platform. Whats wrong with a line like this? DateTime.Parse(myString); Therez nothing wrong with this declaration.Converts the specified string representation of a date and time to its DateTime equivalent.But If the string is not a valid DateTime,It throws an exception. What is the purpose of XML Namespaces? An XML Namespace is a collection of element types and attribute names. It consists of 2 parts 1) The first part is the URI used to identify the namespace 2) The second part is the element type or attribute name itself. Together they form a unique name. The various purpose of XML Namespace are 1. Combine fragments from different documents without any naming conflicts. (See example below.) 2. Write reusable code modules that can be invoked for specific elements and attributes. Universally unique names guarantee that such modules are invoked only for the correct elements and attributes. 3. Define elements and attributes that can be reused in other schemas or instance documents without fear of name collisions. For example, you might use XHTML elements in a parts catalog to provide part descriptions. Or you might use the nil attribute defined in XML Schemas to indicate a missing value. < Department > < Name >DVS1< /Name > < addr:Address xmlns:addr="http://www.tu-darmstadt.de/ito/addresses" > < addr:Street >Wilhelminenstr. 7< /addr:Street > < addr:City >Darmstadt< /addr:City > < addr:State >Hessen< /addr:State > < addr:Country >Germany< /addr:Country > < addr:PostalCode >D-64285< /addr:PostalCode > < /addr:Address > < serv:Server xmlns:serv="http://www.tu-darmstadt.de/ito/servers" > < serv:Name >OurWebServer< /serv:Name > < serv:Address >123.45.67.8< /serv:Address > < /serv:Server > < /Department > *********************************************************************** **********************************************

.NET Xml
An Introduction to Working with XML in .NET Working with XML in .NET applications is a fairly straightforward process especially if

you've used MSXML3 in the past. Even if you haven't worked with MSXML3 you'll find that using the classes found in the .NET platform is easy once you know more about them. There are two main APIs that you can use to access data found within XML documents. These include forward-only, non-cached access, and random access through using the Document Object Model (DOM). The classes that expose both APIs are found within the System.Xml assembly. If you want to access data within an XML document in the most fast and efficient way possible then you'll want to use the XmlTextReader class. This class exposes a pull model that has many advantages over the push model found in the Simple API for XML (SAX). To use this class you must reference the System.Xml assembly in your file. In C# you would do this with the "using" keyword while in Visual Basic you would use the "imports" keyword. Once the assembly is referenced, you can then instantiate the reader as shown below: XmlTextReader reader = new XmlTextReader(pathToXmlDoc); int elementCount = 0; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { elementCount++; } } There are several different constructors available for the XmlTextReader class. The one shown above accepts an XML document file path as a string argument. While the forward-only pull model is certainly very efficient, it is read-only and therefore doesn't allow you to insert, delete, or update nodes in a document. In cases where you need more control or flexibility over an XML document, you'll want to look at using the Document Object Model (DOM). The DOM API works by loading each node found within an XML document into a tree structure similar to a genealogical chart. By having this in-memory structure, random access to different nodes within an XML document is possible. To start the process of creating the DOM tree, you need to reference the System.Xml assembly in your file and then instantiate the XmlDocument class: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(pathToXmlDoc); XmlNode root = xmlDoc.DocumentElement; Adding nodes to the tree can easily be accomplished by using methods associated with the XmlDocument class. The following example shows how to load XML from a file and then add an element as a child of a root node named "root." It also shows how an attribute

can be added to a node as well: XmlDocument xmlDoc = new XmlDocument(); XmlDoc.Load(pathToXmlDoc); XmlElement root = xmlDoc.DocumentElement; XmlElement newNode = doc.CreateElement("newNode"); newNode.SetAttribute("id","1"); root.AppendChild(newNode); This code would result in the following XML document:

In cases where a string containing XML needs to be loaded into the DOM, the XmlDocument class's LoadXml() method can be used. Once in the DOM, the XML can then be manipulated as shown above: string myXml = "Hello"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(myXml); //....manipulation or reading of the nodes can occur here There are many other classes that can perform a variety of tasks in the System.Xml assembly. This article has barely scratched the surface but has hopefully shown that much of your experience with MSXML3 can be used in .NET applications as well. Using many of the other XML related classes in the .NET platform will be detailed in future articles so stay tuned! Reading XML Files using XmlDocument in VB.NET Suppose I have following XML fragment:

Now, how can I loop through my collection of authors and for each author retrieve its first and last name and put them in a variable strFirst and strLast? - - - XMLApp.vb Imports System Imports System.Xml _ Public Class XMLApp Public Sub YourMethod(strFirst As [String], strLast As [String])

' Do something with strFirst and strLast. ' ... Console.WriteLine("{0}, {1}", strLast, strFirst) End Sub 'YourMethod Public Sub ProcessXML(xmlText As [String]) Dim _doc As New XmlDocument() _doc.LoadXml(xmlText) ' alternately, _doc.Load( _strFilename); to read from a file. Dim _fnames As XmlNodeList = _doc.GetElementsByTagName("FirstName") Dim _lnames As XmlNodeList = _doc.GetElementsByTagName("LastName") ' I'm assuming every FirstName has a LastName in this example, your requirements may vary. // for ( int _i = 0; _i < _fnames.Count; ++_i ) If (True) Then YourMethod(_fnames(_i).InnerText, _lnames(_i).InnerText) End If Dim Main As [String]() If (True) Then Dim _app As New XMLApp() ' Passing XML text as a String, you can also use the ' XMLDocument::Load( ) method to read the XML from a file. '

End If ' End Sub 'ProcessXML End Class 'XMLApp ' end XMLApp - - - XMLApp.vb Remember to /reference the System.Xml.dll on the command-line to build XMLApp.vb: vbc.exe /r:System.Xml.dll XMLApp.vb XML Programming using VB.NET

XML has been an integral part of programming these days since the world of programming is moving towards the web. XML is one of the most useful easier ways to store and transfer data. Microsoft .NET framework utilizes XML to store data and transfer data between applications and remote systems including local, intranet or on the Internet. In this article we will explore XML classes and namespaces of .NET Framework Class Library and how to use them in VB.NET to read, write and navigate XML documents. XML Namespaces and Classes Microsoft .NET Runtime Library contains many classes to work with XML documents. These classes are stored in five namespaces - System.Xml, System.Xml.Schema, System.Xml.Serialization, System.Xml.XPath, and System.Xml.Xsl. The purpose of each of these namespace is different. All classes reside in one single assembly System.Xml.dll assembly. Before you proceed to use XML classes in your programs, you need to add reference to the System.Xml.dll assembly and use namespaces in your program by using Imports keyword. First namespace is System.Xml. This namespace contains major classes. This namespace contains many classes to read and write XML documents. In this article, we are going to concentrate on reader and write class. These reader and writer classes are used to read and write XMl documents. These classes are - XmlReader, XmlTextReader, XmlValidatingReader, XmlNodeReader, XmlWriter, and XmlTextWriter. As you can see there are four reader and two writer classes. The XmlReader class is an abstract bases classes and contains methods and properties to read a document. The Read method reads a node in the stream. Besides reading functionality, this class also contains methods to navigate through a document nodes. Some of these methods are MoveToAttribute, MoveToFirstAttribute, MoveToContent, MoveToFirstContent, MoveToElement and MoveToNextAttribute. ReadString, ReadInnerXml, ReadOuterXml, and ReadStartElement are more read methods. This class also has a method Skip to skip current node and move to next one. Well see these methods in our sample example. The XmlTextReader, XmlNodeReader and XmlValidatingReader classes are derived from XmlReader class. As their name explains, they are used to read text, node, and schemas. The XmlWrite class contains functionality to write data to XML documents. This class provides many write method to write XML document items. This class is base class for XmlTextWriter class, which well be using in our sample example. The XmlNode class plays an important role. Although, this class represents a single node

of XML but that could be the root node of an XML document and could represent the entire file. This class is an abstract base class for many useful classes for inserting, removing, and replacing nodes, navigating through the document. It also contains properties to get a parent or child, name, last child, node type and more. Three major classes derived from XmlNode are XmlDocument, XmlDataDocument and XmlDocumentFragment. XmlDocument class represents an XML document and provides methods and properties to load and save a document. It also provides functionality to add XML items such as attributes, comments, spaces, elements, and new nodes. The Load and LoadXml methods can be used to load XML documents and Save method to save a document respectively. XmlDocumentFragment class represents a document fragment, which can be used to add to a document. The XmlDataDocument class provides methods and properties to work with ADO.NET data set objects. In spite of above discussed classes, System.Xml namespace contains more classes. Few of them are XmlConvert, XmlLinkedNode, and XmlNodeList. Next namespace in Xml series is System.Xml.Schema. It classes to work with XML schemas such XmlSchema, XmlSchemaAll, XmlSchemaXPath, XmlSchemaType. The System.Xml.Serialization namespace contains classes that are used to serialize objects into XML format documents or streams. The System.Xml.XPath Namespce contains XPath related classes to use XPath specifications. This namespace has following classes XPathDocument, XPathExression, XPathNavigator, and XPathNodeIterator. With the help of XpathDocument, XpathNavigator provides a fast navigation though XML documents. This class contains many Move methods to move through a document. The System.Xml.Xsl namespace contains classes to work with XSL/T transformations. Reading XML Documents In my sample application, Im using books.xml to read and display its data through XmlTextReader. This file comes with VS.NET samples. You can search this on your machine and change the path of the file in the following line: Dim textReader As XmlTextReader = New XmlTextReader("books.xml") Or you can use any XML file. The XmlTextReader, XmlNodeReader and XmlValidatingReader classes are derived from XmlReader class. Besides XmlReader methods and properties, these classes also contain members to read text, node, and schemas respectively. I am using XmlTextReader class to read an XML file. You read a file by passing file name as a parameter in constructor.

Dim textReader As XmlTextReader = New XmlTextReader("books.xml") After creating an instance of XmlTextReader, you call Read method to start reading the document. After read method is called, you can read all information and data stored in a document. XmlReader class has properties such as Name, BaseURI, Depth, LineNumber an so on. List 1 reads a document and displays a node information using these properties. List 1: Reading an XML document Properties ' Import System.Xml namespace Imports System.Xml Module Module1 Sub Main() ' Create an isntance of XmlTextReader and call Read method to read the file Dim textReader As XmlTextReader = New XmlTextReader("C:\\books.xml") textReader.Read() ' If the node has value If textReader.HasValue Then ' Move to fist element textReader.MoveToElement() Console.WriteLine("XmlTextReader Properties Test") Console.WriteLine("===================") ' Read this element's properties and display them on console Console.WriteLine("Name:" + textReader.Name) Console.WriteLine("Base URI:" + textReader.BaseURI) Console.WriteLine("Local Name:" + textReader.LocalName) Console.WriteLine("Attribute Count:" +textReader.AttributeCount.ToString()) Console.WriteLine("Depth:" + textReader.Depth.ToString()) Console.WriteLine("Line Number:" + textReader.LineNumber.ToString()) Console.WriteLine("Node Type:" + textReader.NodeType.ToString()) Console.WriteLine("Attribute Count:" + textReader.Value.ToString()) End If End Sub End Module

The NodeType property of XmlTextReader is important when you want to know the content type of a document. The XmlNodeType enumeration has a member for each type of XML item such as Attribute, CDATA, Element, Comment, Document, DocumentType, Entity, ProcessInstruction, WhiteSpace and so on. List 2 code sample reads an XML document, finds a node type and writes information at the end with how many node types a document has. List 2. Retrieving NodeType Information ' Import System.Xml namespace Imports System.Xml Module Module1 Sub Main() Dim ws, pi, dc, cc, ac, et, el, xd As Integer ' Read a document Dim textReader As XmlTextReader = New XmlTextReader("C:\\books.xml") ' Read until end of file While textReader.Read() Dim nType As XmlNodeType = textReader.NodeType ' If node type us a declaration If nType = XmlNodeType.XmlDeclaration Then Console.WriteLine("Declaration:" + textReader.Name.ToString()) xd = xd + 1 End If ' if node type is a comment If nType = XmlNodeType.Comment Then Console.WriteLine("Comment:" + textReader.Name.ToString()) cc = cc + 1 End If ' if node type us an attribute If nType = XmlNodeType.Attribute Then Console.WriteLine("Attribute:" + textReader.Name.ToString()) ac = ac + 1 End If

' if node type is an element If nType = XmlNodeType.Element Then Console.WriteLine("Element:" + textReader.Name.ToString()) el = el + 1 End If ' if node type is an entity If nType = XmlNodeType.Entity Then Console.WriteLine("Entity:" + textReader.Name.ToString()) et = et + 1 End If ' if node type is a Process Instruction If nType = XmlNodeType.Entity Then Console.WriteLine("Entity:" + textReader.Name.ToString()) pi = pi + 1 End If ' if node type a document If nType = XmlNodeType.DocumentType Then Console.WriteLine("Document:" + textReader.Name.ToString()) dc = dc + 1 End If ' if node type is white space If nType = XmlNodeType.Whitespace Then Console.WriteLine("WhiteSpace:" +textReader.Name.ToString()) ws = ws + 1 End If End While Console.WriteLine("Total Comments:" + cc.ToString()) Console.WriteLine("Total Attributes:" + ac.ToString()) Console.WriteLine("Total Elements:" + el.ToString()) Console.WriteLine("Total Entity:" + et.ToString()) Console.WriteLine("Total Process Instructions:" + pi.ToString()) Console.WriteLine("Total Declaration:" + xd.ToString()) Console.WriteLine("Total DocumentType:" + dc.ToString()) Console.WriteLine("Total WhiteSpaces:" + ws.ToString()) End Sub End Module Writing XML Documents The XmlWriter class contains the functionality to write to XML documents. It is an abstract base class used through XmlTextWriter and XmlNodeWriter classes. It contains methods and properties to write to XML documents. This class has many Writexxx method to write every type of item of an XML document. For example, WriteNode,

WriteString, WriteAttributes, WriteStartElement, and WriteEndElement are some of them. Some of these methods are used in a start and end pair. For example, to write an element, you need to call WriteStartElement then write a string followed by WriteEndElement. Besides many methods, this class has three properties. WriteState, XmlLang, and XmlSpace. The WriteState gets and sets the state of the XmlWriter class. Although its not possible to describe all the Writexxx methods here, lets see some of them here. First thing we need to do is create an instance of XmlTextWriter using its constructor. XmlTextWriter has three overloaded constructors, which can take a string, stream, or a TextWriter as an argument. Well pass a string (file name) as an argument, which were going to create. In my sample example, I create a file myXmlFile.xml in C:\\ dir. ' Create a new file in C:\\ dir Dim textWriter As XmlTextWriter = New XmlTextWriter("C:\\myXmFile.xml", Nothing) After creating an instance, first thing you call us WriterStartDocument. When youre done writing, you call WriteEndDocument and TextWriters Close method. textWriter.WriteStartDocument() .. textWriter.WriteEndDocument() textWriter.Close() The WriteStartDocument and WriteEndDocument methods open and close a document for writing. You must have to open a document before start writing to it. WriteComment method writes comment to a document. It takes only one string type of argument. WriteString method writes a string to a document. With the help of WriteString, WriteStartElement and WriteEndElement methods pair can be used to write an element to a document. The WriteStartAttribute and WriteEndAttribute pair writes an attribute. WriteNode is more write method, which writes an XmlReader to a document as a node of the document. For example, you can use WriteProcessingInstruction and WriteDocType methods to write a ProcessingInstruction and DocType items of a document. 'Write the ProcessingInstruction node Dim PI As String = "type='text/xsl' href='book.xsl'" textWriter.WriteProcessingInstruction("xml-stylesheet", PI) 'Write the DocumentType node textWriter.WriteDocType("book", Nothing, Nothing, "'softcover'>")

The below sample example summarizes all these methods and creates a new xml document with some items in it such as elements, attributes, strings, comments and so on. See Listing 5-14. In this sample example, we create a new xml file c:\xmlWriterText.xml. In this sample example, We create a new xml file c:\xmlWriterTest.xml using XmlTextWriter: After that we add comments and elements to the document using Writexxx methods. After that we read our books.xml xml file using XmlTextReader and add its elements to xmlWriterTest.xml using XmlTextWriter. List 3. Writing an XML document using XmlTextWriter ' Import System.Xml namespace Imports System.Xml Module Module1 Sub Main() ' Create a new file in C:\\ dir Dim textWriter As XmlTextWriter = New XmlTextWriter("C:\\myXmFile.xml", Nothing) ' Opens the document textWriter.WriteStartDocument() ' Write comments textWriter.WriteComment("First Comment XmlTextWriter Sample Example") textWriter.WriteComment("myXmlFile.xml in root dir") ' Write first element textWriter.WriteStartElement("Student") textWriter.WriteStartElement("r", "RECORD", "urn:record") ' Write next element textWriter.WriteStartElement("Name", "") textWriter.WriteString("Student") textWriter.WriteEndElement() ' Write one more element textWriter.WriteStartElement("Address", "") textWriter.WriteString("Colony") textWriter.WriteEndElement()

' WriteChars textWriter.WriteStartElement("Char") Dim ch() As Char = {"b", "l", "last"} textWriter.WriteChars(ch, 0, ch.Length) textWriter.WriteEndElement() ' Ends the document. textWriter.WriteEndDocument() ' close writer textWriter.Close() End Sub End Module Using XmlDocument The XmlDocument class represents an XML document. This class provides similar methods and properties weve discussed earlier in this article. Load and LoadXml are two useful methods of this class. A Load method loads XML data from a string, stream, TextReader or XmlReader. LoadXml method loads XML document from a specified string. Another useful method of this class is Save. Using Save method you can write XML data to a string, stream, TextWriter or XmlWriter. The following example in List 4 shows you how to use XmlDocument classs Read, ReadXml and Save methods.

You can also use Save method to display contents on console if you pass Console.Out as a parameter. For example: doc.Save(Console.Out) Here is one example of how to load an XML document using XmlTextReader. You read a file in an XmlTextReader and pass this in XmlDocuments Load method to load the document. Dim doc As New XmlDocument() 'Load the the document with the last book node. Dim reader As New XmlTextReader("c:\\books.xml") reader.Read() doc.Load(reader) doc.Save(Console.Out)

XmlDataDocument and DataSet The XmlDataDocument is used to provide synchronization between DataSet and XML documents. You can use XmlDataDocument to read an XML document and generate a DataSet or read data from a DataSet and generate an XML file. Viewing and Writing XML Data using ADO.NET DataSets Abstract Based on a real world project this article shows how to handle XML data in .NET using VB.NET DataSets and DataViews. The article presents step-by-step how to bind, read and view XML data and generate graphical reports with the build-in Crystal Reports engine. The article puts special emphasize on XML standardization and interoperability issues experienced during the project, and presents workarounds for existing limitations. Introduction This project was part of a larger project in the context of training acquisition and analysis. A Palm PDA is used for mobile data acquisition; these data are transferred onto a PC into a well-formed and valid XML data file. The task of this project was to develop a sophisticated data analysis and reporting application on the PC using the given XML data file. The .NET framework was chosen for the PC application because of its great data handling capabilities, its powerful graphic functionality and the built-in reporting engine Crystal Reports. We selected the programming language VB.NET because we believe, that this is the language of the future under .NET and because there is no major difference between the supported languages in VS.NET with respect to their offered functionality. The idea was that both, the existing Palm application and the new VB.NET application can share one common XML file as its data source. XML Access Methods in .NET .NET offers numerous XML-related classes for reading and writing XML documents. Although the documentation states, that any class conforms to the W3C XML 1.0 standard, there are trade-offs in respect to performance, efficiency, productivity, and XML compliance between the different implementations. So we first investigated into these different access methods and then selected the most appropriate for our application. This step also addresses important issues that must be considered when dealing with legacy valid and well-formed XML data in .NET. The VB.NET developer can use any of the following five methods to access XML data: XmlTextReader

XmlValidatingReader XmlDocument (and the rest of the DOM API), XPathNavigator. ADO.NET DataSets The detailed description of these methods would go beyond the scope of this article. Thus the following table summarizes very briefly the characteristics of each method and shows when to use which technology.

Table 1. XML Data Access Methods in .NET When dealing with complex XML Schemas, then ADO.NET DataSet offers greatest support and flexibility. The DataSet, which can be used either relational databases or XML data files, is an in-memory cache of retrieved data. It is the major component for data handling in the ADO.NET architecture. The DataSet provides a consistent relational programming model regardless of the data source; thus it consists of a collection of DataTable objects that you can relate to each other with DataRelation objects. A DataSet reads and writes data and schema as XML documents. The data and schema can be transported across HTTP and used by any application, on any platform that is XML-enabled. Considering all these features and the fact that this VB.NET application will need to be WebService interoperable with a server application in future we decided to go for DataSets. XML Conformance in .NET Going with DataSets, ReadXML and ReadXMLSchema are the methods of choice to read the XML data, and the corresponding XML schema. However doing so with the given valid and well-formed XML data file, raised the following runtime error: The same table {description} cannot be the child table in two nested relations Looking deeper into the file shows that the valid and well-formed (and thus fully W3C compliant) XML file had a child table called description which had more than one parent table. This part of the XML Schema is shown in Figure 1 .

Figure 1. Original XML Schema This is a valid and allowed design according to the W3C XML schema specification.

(Refer: W3C definition of Parent child Relationship). Also the XMLSpy tool validated this XML schema as valid and well-formed. More investigation showed that the .NET XML framework does not (yet?) support the full XML 1.0 standard. It does not support recursive schemas or designs where a child node type is beneath more than one parent node type. Of course, also all classes based on DataSets, like the System.Windows.Forms.DataGrid, which we were going to use, have the same restriction. In other words: XML Design Issue 1: .NET Datasets require that a table can only be a child of one other table. Microsoft has identified this as a bug (Q325695) and their knowledge base article [MSQ325695] gives more information. There are essentially three ways to solve this problem: i) Write custom functions ii) Write a converter iii) Change your XML Schema If you cant break change the existing XML Schema (for example because you are not the owner of the file), there are two ways to solve the problem: you customize all your ode, or you write a converter. Customizing all your code means you write special methods for the XmlReader class and add records to a table with a hierarchical type design. You also have to implement a custom filtering mechanism if you want to display this data in bound controls, and a custom writing mechanism to write to the type of hierarchical format you are reading from. Even worse, any change in the schema file will cause changes in all of your custom functions so this isnt really an. The second option, if you cant change the given XML Schema, is to write a converter. That means you define a new .NET compliant XML Schema for the given XML file and make use of the given DataSet capabilities. Then you write a bi-directional converter to convert the data from one XML Schema into the other before you use it. Although this still causes additional effort, it causes the least additional effort. If you are the owner of the XML Schema file, then solution is to change the given the given XML Schema and make it also .NET compliant. In our situation, this meant, to define three different description type structures (Idescription, Ddecscription, Fdescription), for the three occurrences of the description. To avoid multiple definitions of the same structure (which can cause maintenance errors in the future), we made use of the inheritance capabilities of XML Schema. We derived the three description types from the still existing base structure description. The details are shown in figure 2.

Figure 2. Avoid one child with several parents Reading XML Data with DataSets VB.NET developers have several approaches of using a DataSet in the applications. This section explains the chosen approach to create a DataSet from the modified XML Schema, the tools that were used and how we populated the DataSet from the XML source file. A DataSet can be typed or untyped. A typed DataSet is a dataset, which is created based a given XML Schema definition file (XSD file). Information from the schema (tables, columns, etc.) is generated and compiled into the new DataSet class as a set of first-class objects and properties. Because a typed DataSet class inherits from the base DataSet class, the typed class assumes all of the functionality of the DataSet class and can be used with methods that take an instance of a DataSet class as a parameter An untyped DataSet, in contrast, has no corresponding built-in schema. As in a typed dataset, an untyped DataSet contains tables, columns but those are exposed only as collections. (However, after manually creating the tables and other data elements in an untyped DataSet, you can export the DataSet 's structure as a schema using the DataSet 's WriteXmlSchema method.) You can use either type of DataSet in your application. However, Visual Studio has more tool support for typed DataSets, and they make programming with the DataSet much easier and less error-prone. So having considered all these options the decision was to go with ADO.NET typed DataSets. Typed Datasets can be generated with the XSD.EXE tool, which is part of the VS.NET environment. The tool accepts a valid XML Schema file as input, as well as the language to use (C#, VB). The following line shows a typical command line of the tool which uses the XML Schema file XSDSchemaFileName.xsd. xsd.exe /d /l:VB.NET XSDSchemaFileName.xsd /n:XSDSchema.Namespace The /d directive tells the tool to generate DataSets, /l specifies the language to use, the optional /n defines the namespace to generate. The generated DataSet classes will be saved in the source file XSDSchemaFileName.vb. Once the Typed DataSet classes are generated, the further procedure is almost a childs play. The provided methods and properties guarantee data access in a type safe manner. So the next step was to populate the Typed DataSet at runtime from the XML file. The ReadXml() and the WriteXml() methods of the typed DataSet class do this very easily

without any difficulty as the following to lines of code show: Dim myDS As New DataSet() myDS.ReadXml("input.xml", XmlReadMode.ReadSchema) Viewing XML Data Having created and populated the DataSet the next step was to bind the data to the windows controls for user interaction. Since we were going to implement a grid view, this involved binding DataTables to DataGrids with user navigation facilities and providing parent-child relationships in the grid view so when a user selects a parent row, the corresponding child rows are to be shown automatically for editing purposes. The DataTable is the primary building block of ADO.NET. The DataTable is made up of a DataColumn and DataRow collections. The columns define the schema of the DataTable and the rows make up the actual data in the DataTable. A DataView is a bindable, customized view of a DataTable. You can create multiple DataView's of the same DataTable, each one can contain different data sorted in different order. Additionally, you can add, delete, or edit information in each DataView. DataTable and DataView use the same instances of DataColumns, i.e. they share the common structure. However DataTable and DataView each have its own row collections. The DataTable is consists of DataRow's while the DataView is made up DataRowView's. Figure 3 shows the relationship between DataSet, DataTable and DataView.

Figure 3. Tables and Views The data binding of typed DataSets is very smooth in VB.NET. You can bind the data sources to the WindowsForms controls at design time or runtime without any difficulty. For example, you can specify which data column to be bound to a ComboBox in a WindowsForm by setting the DataSource and DataMember property of that control so that it gets automatically bound at runtime. We used the .NET DataView class to bind DataTables to the DataGrid. DataView supports data filtering and data sorting at design time or at runtime. For convenience a default DataView is generated for the developer for customization. In the analysis part, the application needs to display some statistical information, which is calculated from several columns and which is shown in some dynamically generated extra columns as shown in Figure 4 .

Figure 4. The data view Some of the data columns needed for these calculations were in different parent and child

tables. Unfortunately it was not possible join two tables in the dataset to show up in a single DataGrid.(for example, by using the DataSet.Relations property).To further clarify the situation say I have two Parent & child tables Table1(id,columnA,columnB) and Table2(id,columnC,columnD) and I want resulting datagrid columns to be view like (columnA , columnB , columnC , columnD). It is similar to the situation if I had wrote a sql query like select a.id , a.columnA , a.columnB , b.[columnC] , b.[columnD] From Table1 a , Table2 b where a.id =b.id It is important to understand that DataView is not equivalent of a SQL VIEW. A Dataset does not contain a query processor and has no mechanism to perform a join. The other way to do it (most developers seems to suggest) is to simply create a new datatable That is typed the way you want it and manually moved the data from both datatables to the new one. Also any data manipulation has to copy over to the original tables using a nested loops. This is a brute force method. It would be nice to here if anyone come up with something else. Finally more references were added to the schema file. But that is not the best workaround. The reason that the columns could not be merged is founded in the relational programming model of the DataSets. The existing XML file uses nested child tables instead of references. This is not (yet?) resolved by the .NET DataSets, so that references are missing to cross-reference tables and to establish relationships. XML Design Issue 2: Use references in XML data files instead of nested child tables to show up a joined table in a single DataGrid So the next change was to introduce references where needed.

Figure 5. Adding references to tables In our application we use the Date column as a filter criteria for the generated graphs in the Crystal Report Engine. Thus in Figure 5 a Date column has been added to the session table, which is a direct reference of the date column of the day table. Reporting XML Data Having completed the data binding to Windows forms the next task was to generate the summarized reports in both graphical and tabular forms. We have chosen the Crystal Reports Engine (which is delivered with the VS.NET environment) with its powerful dynamic reporting capabilities.

Crystal Reports for Visual Studio .NET offers the following three object models: >The Engine Object Model >The Windows Forms Viewer Object Model >The Web Forms Viewer Object Model The top level Engine object model is the report document object. The report document object offers sophisticated control over your object. It contains all the properties and methods needed to interface with and customize a report. How ever it does not provide the display of the reports. This is where viewer objects and the report document objects come together. The Windows Forms viewer allows you to view a report in a Windows application and the Web Forms viewer does it for a Web application. So we selected the Engine Object model together with the Windows Object Model to accomplish the requirements. The Vb.NET CrystalDecisions.Windows.Forms namespace in the CrystalDecisions.Windows.Forms.dll assembly provides support for the Windows Forms Viewer control and its associated classes. It can also dynamically update the report being hosted and interact with controls within a windows application. When using the Crystal Report Engine you basically have two options for the selection of data source. The first one is passing the raw XML file, and the second is passing the populated DataSet to the Crystal Report Engine. When using the first approach you have to verify on every usage, that the XML file contains correct data types (data validation). Otherwise Crystal Report Engine would interpret the data types in the XML files differently (e.g. float are used as strings), which prevents the data from being processed further within Crystal Reports. The second, recommended option is passing the already populated typed DataSets to the Crystal Report Engine. This saves the runtime verification of data types. The content and the scope of the report is determined at runtime according to the user selection of the required report format. Crystal Reports provides template files for this. Figure 6 shows a sample report. Figure 6. Crystal Report View Summary Visual Studio .NET has a very rich set of tightly integrated tools that work together to support C# application developer. For XML based applications it provides schema generation and validation tools. It offers the methods of choice for XML handling. Especially the DataSet classes make reading and writing of XML data extremely easy. The DataSet classes provide easy data binding to the GUI and to even third-party tools like Crystal Reports for advanced reporting. Other very nice new features are the new source code documentation support and

application installer production. The code documentation tool generates a very nice HTML documentation (they improved the JavaDoc style), which is completely XML based. The integrated application installer allows easy creation of a setup program for your application. Despite the currently existing limitations of DataSets concerning its XML standard support, it is the tool of choice for XML data handling with .NET. Once your XML data sources confirm to the .NET XML standard the rest can be handled without much difficulty. It offers lot of built-in powerful classes and methods for reading, writing and displaying data. This allows the developer to concentrate on the more important application logic rather than having to worry about data handling issues or framework specifics. Generating XML from SQL Database Description This sample shows how you can obtain a Dataset from (in this case) a SQL Server database, and then write it out to an XML Document. As an "Extra Added Bonus(tm)", it can show you how to write the schema as well. The SQL Server database in question is the venerable and useful Northwind database. The significant parameters are all declared at the beginning as strings, so that you can easily debug and tweak for your own usage. In this section, we create a connection string, a query string (in standard SQL) and specify a target filename. Then, we call the function, Shared Sub writeSQLQueryToFileAsXML(connString As String, query As String, filename As String) This function first gets a connection, creates an adapter and specifies the connection and command to run through it, then obtains a dataset from that adapter. This function then shows how you can write that DataSet out to a stream (in this case, a FileStream) as an XML document through the DataSet member, public void WriteXml(Stream). And if you've got some extra time on your hands, you can even uncomment the code in the last section, to write the DataSet's SCHEMA to a file! An interesting corollary to this example would be to stream the DataSet's XML out to an HTTPResponse's HTTPWriter.outputStream, but that is both the subject of another sample, and also perhaps more easily done through native SQL Server capabilities. Note that the XML that is written is output as a fragment, that is, there is no element, at the beginning, nor is there a unifying, single root node. While you will have to add both of these, this is really a sensible choice. First of all, only you, and your particular application context, can say what is the right name for the root node - is it , or ? Secondly,

it may be a node or set of nodes buried down inside a much larger document, such as a node under one of several nodes. Get the picture? Compiling and Running the code: vbc XMLGenFromSQLDbPB.vb Or vbc /r:System.dll,System.Data.dll,System.Xml.dll XMLGenFromSQLDbPB.vb This will return you with the location where it had saved the XML file.You can specify it in the String s. Source Code: Imports System Imports System.Data Imports System.Xml Imports System.Data.SqlClient Imports System.IO Namespace WriteXML Public Class WriteXML Shared Sub Main() '******************************************************************* ' NOTE : YOU WILL NEED TO HAVE SQL SERVER (or MSDE) AVAILABLE, AND ' YOU WILL NEED THE NORTHWIND DATABASE INSTALLED IN THE SQL SERVER ' INSTANCE IN ORDER FOR THIS TO WORK. ' ' MODIFY THE FOLLOWING CONNECTION STRING AND QUERY STRING TO RUN ' THIS SAMPLE AGAINST A DIFFERENT DATABASE AND/OR QUERY. '******************************************************************* Dim outputFileName As String = "C:/myXmlData" ' ".xml" will be appended. Dim connString As String = "user id=sa;password=password;" + "Database=northwind;server=(local);" Dim sqlQueryString As String = "SELECT * FROM Suppliers" ' Here's the meat of the demonstration. writeSQLQueryToFileAsXML(connString, sqlQueryString, outputFileName) Console.WriteLine("Wrote query results to {0}", outputFileName) End Sub 'Main

Shared Sub writeSQLQueryToFileAsXML(connString As String, query As String, filename As String) Dim myConn As New SqlConnection(connString) Dim adapter As New SqlDataAdapter() adapter.SelectCommand = New SqlCommand(query, myConn) ' Build the DataSet Dim myDs As New DataSet() adapter.Fill(myDs) Dim myFs As FileStream = Nothing ' Get a FileStream object myFs = New FileStream(filename + ".xml", FileMode.OpenOrCreate, FileAccess.Write) ' Apply the WriteXml method to write an XML document myDs.WriteXml(myFs) ' It is always good housekeeping to close a file. myFs.Close() End Sub 'writeSQLQueryToFileAsXML End Class 'WriteXML '************************************************** End Namespace 'WriteXML ' Uncomment the following code if you also want to ' dump the DataSet's schema to a file... '*************************************************** ' ' Get a FileStream object ' myFs = new FileStream(filename+"_Schema.xml", ' FileMode.OpenOrCreate, ' FileAccess.Write); ' myDs.WriteXmlSchema(myFs); ' ' It is always good housekeeping to close a file. ' myFs.Close(); Inserting Data to an XML Document

The XmlNode and the XmlDocument classes can be used to insert XML data to an existing document or to a new document. Adding namspace Reference Since Xml classes are defined in the System.XML namespace, so first thing you need to do is to Add the System.XML reference to the project. Imports System.Xml Loading XML to Document LoadXml method of XmlDocument can be used to load XML data to a document or to load an existing XML document.. ' Load XML data to a document Dim doc as new XmlDocument(); doc.LoadXml("" + " Old Data" + "") Inserting XML Data The below code inserts XML data to the file and saves file as InsertedDoc.xml. Souce Code: Try Dim currNode As XmlNode Dim doc As New XmlDocument() doc.LoadXml(("" + " Old Data" + "")) Dim docFrag As XmlDocumentFragment = doc.CreateDocumentFragment() docFrag.InnerXml = "" + " Inserted Data" + "" ' insert the availability node into the documentcurrNode = doc.DocumentElement.FirstChild; currNode.InsertAfter(docFrag, currNode.LastChild) 'save the output to a filedoc.Save("InsertedDoc.xml"); Catch e As Exception Console.WriteLine("Exception: {0}", e.ToString()) End Try The output of the code looks like this Old Data Inserted Data

Reading XML Files in VB.NET The XmlReader and XmlTextReader classes are defined in the System.XML namespace. The XmlTextReader class is derived from XmlReader class. The XmlTextReader class can be used to read the XML documents. The read function of this document reads the document until end of its nodes. In this article, I will show you how to use XmlTextReader class to read an XML document and write data to the console. Adding namspace Reference Since Xml classes are defined in the System.XML namespace, so first thing you need to do is to Add the System.XML reference to the project. Imports System.Xml Open an XML Document The constructor of the XmlTextReader class opens an XML file. In this sample, I used an XML file called xmltest.xml in C\temp directory. You can download the attached file. ' Open an XML file Dim reader As New XmlTextReader("C:\temp\xmltest.xml") Reading Data The Read method of the XmlTextReader class reads the data. While reader.Read() Console.WriteLine(reader.Name) End While Imports System Imports System.Xml Namespace ReadXML End Namespace 'ReadXML ' ' Summary description for Class1. ' public class Class1 Class1() Dim Main As Integer String() If (True) Then

Try ' Open an XML file Dim reader As New XmlTextReader("C:\temp\xmltest.xml") While reader.Read() Console.WriteLine(reader.Name) End While Catch e As Exception Console.WriteLine("Exception: {0}", e.ToString()) End Try Return 0 End If Writing XML Files in VB.NET The XmlWriter and XmlTextWriter classes are defined in the System.XML namespace. The XmlTextWriter class is derived from XmlWriter class, which represents a writer that provides fast non-cached forward-only way of generating XML documents based on the W3C Extensible Markup Language (XML) 1.0 specification. In this article, I will show you how to use XmlTextWriter class to create an XML document and write data to the document. Adding namspace Reference Since Xml classes are defined in the System.XML namespace, so first thing you need to do is to Add the System.XML reference to the project. Imports System.Xml Creating an XML Document The constructor of the XmlTextWriter class creates an XML file if file doesn't exist. In this sample, I create a new XML file called xmltest.xml in C\temp directory. Dim writer As New XmlTextWriter("C:\temp\xmltest.xml", Nothing) NOTE: If you don't want to write data in an XML file and want to display XML contents on the Console, pass Console.Out as a parameter of the constructor. Dim writer As New XmlTextWriter(Console.Out) Adding Data to the Document The WriteStartDocument method starts a new document. The WriteStartElement and the WriteEndElement pair is used to add a new element to the document. The WriteString writes a string to the document.

writer.WriteStartDocument() writer.WriteComment("Commentss: XmlWriter Test Program") writer.WriteProcessingInstruction("Instruction", "Person Record") writer.WriteStartElement("p", "person", "urn:person") writer.WriteStartElement("LastName", "") writer.WriteString("Chand") writer.WriteEndElement() writer.WriteElementInt16("age", "", 25) writer.WriteEndDocument() Imports System Imports System.Xml Namespace WriteToXML ' ' Summary description for Class1. ' Public Class Class1 Public Sub New() End Sub 'New 'Entry point which delegates to C-style main Private Function Public Overloads Shared Sub Main() System.Environment.ExitCode = Main(System.Environment.GetCommandLineArgs()) End Sub Overloads Public Shared Function Main(args() As String) As Integer Try ' Creates an XML file is not exist Dim writer As New XmlTextWriter("C:\temp\xmltest.xml", Nothing) ' Starts a new document writer.WriteStartDocument() 'Write comments writer.WriteComment("Commentss: XmlWriter Test Program") writer.WriteProcessingInstruction("Instruction", "Person Record") ' Add elements to the file writer.WriteStartElement("p", "person", "urn:person") writer.WriteStartElement("LastName", "") writer.WriteString("Chand") writer.WriteEndElement() writer.WriteStartElement("FirstName", "") writer.WriteString("Mahesh")

writer.WriteEndElement() writer.WriteElementInt16("age", "", 25) ' Ends the document writer.WriteEndDocument() Catch e As Exception Console.WriteLine("Exception: {0}", e.ToString()) End Try Return 0 End Function 'Main End Class 'Class1 End Namespace 'WriteToXML Creating XML Documents with the XmlTextWriter Class Introduction As XML's popularity and use in Web-enabled applications continues to rise, it is becoming more and more important to have a good understanding of how to create, consume, and alter XML documents through .NET. In simplest terms, an XML file is really nothing more than a bulky text file, and prior to .NET, many ASP developers, when needing to generate an XML file on the fly, simply Response.Writed out the content of the XML document. While Response.Write-ing an XML file works, it is far from ideal for a number of reasons. First, since it composes an XML document with strings, one has to worry about escaping those characters that are illegal in XML. There are a number of illegal characters that cannot appear in the text portion of an XML document. These are <, >, &, ", and '. When generating an XML document as a string, you have to manually search for these illegal characters and escape them. Second, with complex XML documents with many namespaces, attributes, and elements, the code necessary to Response.Write out the document can become cryptic. Fortunately, the .NET Framework provides a class designed specifically to create XML documents, the System.Xml.XmlTextWriter class. By using this class to create XML documents you don't need to worry about illegal XML characters in the text portion of the XML document, and the end code is much cleaner. In this article we'll look at using the XmlTextWriter class to create XML documents on the fly. The Basics of the XmlTextWriter Class The XmlTextWriter class contains a number of methods that are useful for starting and completing an XML document and for adding elements and attributes to the XML document. The most important methods are: WriteStartDocument() - you should call this method to start creating an XML

document. This will create the first line in the XML document, specifying that the file is an XML document and its encoding. WriteStartElement(string) - this method creates a new element in the XML document with the name specified by the string input parameter. (You can also specify a namespace as a second, optional string parameter.) WriteElementString(name, text_value) - If you want to create an XML element with nothing but text content (i.e., no nested elements), you can use this method. WriteAttributeString(name, value) - this method writes an attribute name and value to the current element. WriteEndElement() - this method closes off the element created in the WriteStartElement(string) method call. WriteEndDocument() - this method completes the writing of the XML document. Close() - this method closes the underlying stream, writing the contents of the XML document to the specified file location. To get started using the XmlTextWriter class you need to specify the file and encoding in the class's constructor. The encoding needs to be of the type System.Text.Encoding; some example encoding values are: System.Text.Encoding.ASCII, System.Text.Encoding.Unicode, and System.Text.Encoding.UTF8. Alternatively, you can specify in the constructor that the output of the XmlTextWriter class should be squirted out to a specified Stream. Creating a Simple XML Document with XmlTextWriter To demonstrate using the XmlTextWriter class let's create a simple XML document, saving it to a specified file location. This XML document will contain information about the current user visiting the page, and will have this structure:

URL referrer info User agent referrer info languages info visitor's IP address raw URL requested

(This XML file structure was chosen so that it would illustrate using all of the XmlTextWriter methods discussed in the previous section.) The code needed to create this XML document through an ASP.NET Web page is shown below: <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Text" %>

(script language="C#" runat="server") void Page_Load(object sender, EventArgs e) { // Create a new XmlTextWriter instance XmlTextWriter writer = new XmlTextWriter(Server.MapPath("userInfo.xml"), Encoding.UTF8); // start writing! writer.WriteStartDocument(); writer.WriteStartElement("userInfo"); // Creating the element writer.WriteStartElement("browserInfo"); if (Request.UrlReferrer == null) writer.WriteElementString("urlReferrer", "none"); else writer.WriteElementString("urlReferrer", Request.UrlReferrer.PathAndQuery); writer.WriteElementString("userAgent", Request.UserAgent); writer.WriteElementString("userLanguages", String.Join(", ", Request.UserLanguages)); writer.WriteEndElement(); // Creating the element writer.WriteStartElement("visitInfo"); writer.WriteAttributeString("timeVisited", DateTime.Now.ToString()); writer.WriteElementString("ip", Request.UserHostAddress); writer.WriteElementString("rawUrl", Request.RawUrl); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); } First, notice that the System.Xml and System.Text namespaces have been imported. The Page_Load event handler begins by creating a new XmlTextWriter instance, indicating that its content should be saved to the file userInfo.xml and that its encoding should be UTF8 (a translation of 16-bit unicode encoding into 8-bits). Note that for each element with nested elements a WriteStartElement(elementName) method is called, along with a matching WriteEndElement() after the inner content has been renderred. Furthermore, the WriteElementString(elementName, textValue) is used for those elements with just text content.

Emitting XML Content to the Browser Window Directly The previous example demonstrates how to use the XmlTextWriter class to create an XML document and persist it to a file. While this may be precisely what you are after, oftentimes when creating an XML document in an ASP.NET Web page we want to emit the XML content's to the client requesting the Web page. While this could be done in the previous example by opening the userInfo.xml file after creating it and then Response.Write()ing its contents out, this approach is a bit of a hack. A better approach is to have the results of the XmlTextWriter emitted directly to the output stream. This can be accomplished quite easily, by changing one line of code in the previous code sample. In the XmlTextWriter constructor, rather than specifying a file path, we can specify a Stream. Specifically, we want to specify Response.OutputStream. When doing this you will need to make another small change to the ASP.NET Web page. In the <@ Page ... > directive you need to indicate the page's MIME type as text/xml. If you don't do this, some browsers may think the data being sent is for a standard HTML Web page, and will attempt to format the XML document just as they would an HTML page (which will hide the XML elements and remove all whitespace). The following code shows an abbreviated version of the previous code sample, with the changes in bold. <@ Page ContentType="text/xml" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Text" %> (script language="C#" runat="server") void Page_Load(object sender, EventArgs e) { // Create a new XmlTextWriter instance XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8); // start writing! ... } Notice that by viewing the live demo you are shown an XML document (even though you are visiting an ASP.NET Web page). This is the same XML document that, in the previous code sample, was saved to userInfo.xml. Conclusion In this article we examined how to create an XML document using the System.Xml.XmlTextWriter class of the .NET Framework. The XmlTextWriter class can persist its generated XML document to a file location or a specified stream, in a number of encodings. Using the XmlTextWriter class has many advantages over building up an XML document one string at a time. The main ones being more legible code and not needing to worry about escaping illegal XML characters.

Posted by NMK at 1:55 AM 0 comments

Friday, June 20, 2008 *********************************************** *******************************

You might also like