Source : http://www.visualbuilder.

com/csharp/tutorial/ Introduction to C sharp C# (pronounced "C sharp") is a simple, modern, object-oriented, and type-safe programming language. It will immediately be familiar to C and C++ programmers. C# combines the high productivity of Rapid Application Development (RAD) languages. The following are the advantages C# provides :• • • • Interactive Development Environment. Visual designers for building Windows and Web applications. Compiler. Debugger. Features of C# language: • • • • • • • Simple Type safe Versioning: making new version of an application from existing One to work . Follows all OOPs paradigm Automatic garbage collection Flexible Application Types in C#

C#

1. Class Library:- Creates a project for creating classes that can be used in
other applications. interface.

2. Console Application:- Creates a Visual C# application with a command-line 3. Asp.Net Web Application:- Creates a Visual C# application with a Web user
interface.

4. Asp.Net Web Service:- Creates an XML Web service with Visual C# that
other applications can access.

5. Asp.Net Mobile Web Application:- Creates an application viewable on
PDAs, cell phones, and other mobile devices. Starting C# using System; using System.Collections.Generic; using System.Windows.Forms;

namespace cSHARPEXAMPLES { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [ STAThread ] static void Main () { Application .EnableVisualStyles(); Application .SetCompatibleTextRenderingDefault( false ); Application .Run( new Form1 ()); } } }

A C# program is divided into 4 parts:

1. Namespace declaration:- This specifies the namespaces that we are going 2. 3.
to use in the application. E.g. Using System; Class declaration:- Here we mentioned the starting class forthis project or we can say that this is the entry point for ourapplication. Main method:- The main method is the entry point of this application and here we can specify the form that we need to open first from this application Application .Run( new Form1 ()); // This line indicates that the control is passed to the instance of Form1() in the application once we start with the application. Comments:- The comments are given by // and /* */ block in the C# programs.

4.

Compilation:- This project can be compiled through command prompt using the following command. The command will create a file called “Program.exe”, which we can execute. Csc.exe Program.cs Types in C#:C# supports two kinds of types: value types and reference types. Value types include simple types (e.g., char, int, and float), enum types, and struct types. Reference types include class types, interface types, delegate types, and array types.

Value Types

Reference Types

Allocated on stack

Allocated on heap

A value type variable contains the data itself

Reference type variable contains the address of memory location where data is actually stored

When we copy a value type variable to another one, the actual data is copied and each variable can be independently manipulated.

When copying a reference type variable to another variable, only the memory address is copied. Both variables will still point to the same memory location, which means, if we change one variable, the value will be changed for the other variable too.

Integer, float, Boolean, double etc are value types.

String and object are reference types.

Struct is value type.

Classes and interfaces are reference types.

Control Statement: Selection Statement in C sharp Control statements are used to process some conditional code which only runs if the condition is true otherwise some alternate code may be processed. The following are two control statements used in C#.

1. if-else statement 2. switch statement
IF-ELSE Statement: If Statement allows you to take different path depending on the decision condition. The condition must return boolean. When the condition evaluates to a boolean true, a block for that true condition will be executed.

Syntax:

If (condition) { // Single if statement //execute block if condition, returns true.}

If (condition) { // execute block if condition, return false } else { // execute block if condition, return false }

If (condition1) { // execute block if condition1 is true } else if (condition2) { // execute block if condition2 is true } else if (condition 3) { // execute block if condition3 is true } else { // otherwise if none condition satisfied then, this block will execute. } Switch Statement: Another selection statement is the switch statement, which executes a set of logic depending on the value of a given parameter that is evaluated by switch statement. The type of values a switch statement operates on can be Boolean, Enums, Integral Type and Strings.

Syntax: Switch (Evaluated Value can be Boolean or Enums or integral type or strings) { //switch with integer type Case 1: // Block of statement Break; Case 2: // Block of statement Break; Case 3: // Block of statement

Break; Case 4: // Block of statement Break; Default: // Block of statement Break; }

Note:- The switch block follows the switch expression, where one or more choices are evaluated for a possible match with the switch expression. Each choice is labeled with the case keyword, followed by an example that is of the same type as the switch expression and followed by a colon (:). When the result evaluated in the switch expression matches one of these choices, the statement immediately following the matching choice is executed. The block ends with either break, continue, goto, return or throw statement. Example: Demonstrate Selection Statement

using System; using System.Collections.Generic; using System.ComponentModel;

using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load( object sender, EventArgs e) { Console.WriteLine( "FORM 2" ); } private void button1_Click( object sender, EventArgs e) { // Here we can go through the example on IF int _value = Int32 .Parse(txtEnter.Text);

if (_value > 100) { MessageBox .Show( "Value is greater than 100" ); txtEnter.Text = "" ; } else if (_value < 100 && _value > 200){ MessageBox .Show( "Value is greater than 100 but less than 200" ); txtEnter.Text = "" ; } else { MessageBox .Show( "Value is less than 100" ); txtEnter.Text = "" ; } } private void button2_Click( object sender, EventArgs e) { // Here we can go through the example on Switch int _value = Int32 .Parse(txtEnter.Text); switch (_value) // switch example with integer type { case 1:

case 4: case 5: //Here the case 1 and 4 has no break, this will falls to this statement MessageBox .Show( "Value is 1 or 4 or 5" ); txtEnter.Text = "" ; break ; case 2: MessageBox .Show( "Value is 2" ); txtEnter.Text = "" ; break ; case 3: MessageBox .Show( "Value is 3" ); txtEnter.Text = "" ; break ; default : MessageBox .Show( "Value is greater than 3" ); break ; } } } }

Output:

Click on: IF Example Button

This print value is less than 100 Click on: switch Example Button

This print value is greater than 3

LOOPS…… ……………………… Methods Methods help you to separate code into modules that perform a given task. Every program or application have a starting entry point to there application that decide the path execution and all. We already come across different application where the starting point or entry point is main ( ) method. Methods provide the flexibility where we can separate the code into modules. This will make easy understanding of

code, more reusability and increase performance. The method can pass parameters to another method and return the value that is optional. If the method contains “void” keyword, this means method will not return any thing. Syntax: access specifier return-type methodname (parameter list) { //Statement } Method Chaining:- The method chaining is the process by which one method calls another method. The caller method can pass parameters to the called method and in return the called method return some value (this is optional). Example The following example will demonstrate the method concepts along with the method chaining. using System; using System.Collections.Generic; using System.Windows.Forms; namespace cSHARPEXAMPLES { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [ STAThread ] static void Main () {

Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault( false ); Application.Run( new Form1 ()); } } }

Method Chaining: Here we can add two values to the form and User can select the options i.e. 1 Add, 2 Subtract, 3 Multiply and 4 Divide. And result will be displayed when the user click Execute. using System; using System.Collections.Generic; using System.ComponentModel;

using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form4 : Form { public Form4() { InitializeComponent(); } private void Form4_Load( object sender, EventArgs e) { lblEnter.Text = "" ; lblEnter.Text = lblEnter.Text + "Enter 1 to Add" + "\n" ; lblEnter.Text = lblEnter.Text + "Enter 2 to Sub" + "\n" ; lblEnter.Text = lblEnter.Text + "Enter 3 to Multiply" + "\n" ;

lblEnter.Text = lblEnter.Text + "Enter 4 to Divide" + "\n" ; } private void btnExecute_Click( object sender, EventArgs e) { int _valDec = Int32 .Parse(txtdecision.Text); int _firstVal = Int32 .Parse(textBox1.Text); int _secondVal = Int32 .Parse(textBox2.Text); switch (_valDec) { case 1: fxadd(_firstVal, _secondVal); break ; case 2: fxsubtract(_firstVal, _secondVal); break ; case 3: fxmultiply(_firstVal, _secondVal); break ; case 4: fxdivide(_firstVal, _secondVal); break ; default : MessageBox .Show( "Please Enter Specified Value.." ); break ; } }

void fxadd( int firstarg, int secondarg) { int _add = firstarg + secondarg; txtResult.Text = _add.ToString(); } void fxsubtract( int firstarg, int secondarg) { int _sub = (firstarg - secondarg); txtResult.Text = _sub.ToString(); } void fxmultiply( int firstarg, int secondarg){ int _mul = firstarg * secondarg; txtResult.Text = _mul.ToString(); } void fxdivide( int firstarg, int secondarg){ int _div = firstarg / secondarg; txtResult.Text = _div.ToString(); } } }

Output

Namespaces Namespaces are C# program elements that are used for logical grouping of the classes. They also provide assistance in avoiding name clashes between two sets of codes. Namespaces doesn't corresponds to file or directory names. The using directives e.g. Using System; This contains number of classes, by including this namespace we can access those classes that are there in the System namespace. Example:- Demonstrate Namespace

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Test = rootnamespace.firstlevelnamespace; namespace cSHARPEXAMPLES { public partial class Form5 : Form { public Form5() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { rootnamespace.firstlevelnamespace. TestDemo .fxTest(); rootnamespace.firstlevelnamespace. TestDemo11 .fxDisplay();

Test. TestDemo11 .fxDisplay(); } private void button2_Click( object sender, EventArgs e) { secondnamespace.firstlevelnamespace. TestDemo1 .fxTest1(); secondnamespace.firstlevelnamespace. TestDemo1 .fxTest(); } } }

namespace rootnamespace { // nested namespace namespace firstlevelnamespace { class TestDemo { public static void fxTest()

{ MessageBox .Show( "Fire UP rootnamespace " ); } } class TestDemo11 { public static void fxDisplay() { MessageBox .Show( "Display under rootnamespace " ); } } } }

namespace secondnamespace { // nested namespace namespace firstlevelnamespace {

class TestDemo1 { public static void fxTest1() { MessageBox .Show( "Fire UP secondnamespace" ); } public static void fxTest() { MessageBox .Show( "Fire UP secondnamespace.firstlevelnamespace.fxTest" ); } } } } Example Explanation: In above example we have 3 namespaces i.e. cSHARPEXAMPLES, rootnamespace, secondnamespace.Rootnamespace contains irstlevelnamespace namespace,2 classes i.e TestDemo, TestDemo11 and these classes contains methods i.e. fxTest(),fxDisplay(). Secondnamespace contains nested namespace i.e. firstlevelnamespace, 1 class i.e. TestDemo1 and the class contains methods i.e fxTest1(),fxTest(). Introduction to Classes Classes are the core of OOP's. Classes are declared by using the keyword classes. Classes contain data members that represent the class. We can create object of the

class, objects are entities and we can create as many number of objects of a given class. Syntax: Class classname { //Variable declaration // Method declaration } Classes can contain the following entities inside its declaration: • • • • • • • • • Constructors Destructors Fields Methods Properties Indexers Delegates Events Nested Classes. Constructors:- Constructors are called or initialized automatically whenever an object of the class is created. The purpose of the constructors is to initialize the class members whenever an object of the class is created. • • • Constructor name is same as of class name. Constructor doesn't return any value, nor even void Constructor initialize the class members at the time of its creation There are different types of constructor: • • • Default Constructor Parameterized Constructor Copy Constructor Destructor:- Destructor is used to deallocate any memory that is allocated to the object at the time of its creation. Destructor is used for memory management and avoids any memory leaks that occur in the case of reference variables that store on heap memory. Destructor keeps tracks of all the unwanted and unused memory and frees it when we are not using it. • • In .net the memory management is automatically done through GC i.e. garbage collection, this is responsible for deallocation of memory. The reference variable memory allocated on heap and here the job of GC comes into picture, it will deallocate the memory that is not in used.

The value type variables allocated memory on stack, here the variable doesn't require any GC, they just fall from the stack if there are not in used. Example: Demonstrate Constructor, Destructor and used of Static method .

TestDemo.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { public class TestDemo { String str; static String str2 = "default" ; public TestDemo() { //Constructor str = "Hi" ; } public TestDemo( String strdefault) { //Parameterized Constructor str = strdefault; } public String display(){ return str; }

public static String staticfx() { return str2 + " This comes from Static fx" ; } ~TestDemo() { // Clean Up Code Here. } } } Form6.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form6 : Form { public Form6() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Calling Default Constructor TestDemo obj = new TestDemo (); MessageBox .Show( "default Constructor :: " +obj.display()); } private void button2_Click( object sender, EventArgs e) { //Calling Parameterized Constructor TestDemo obj1 = new TestDemo ( "Vikrant" ); MessageBox .Show( "Parameterized Constructor :: " +obj1.display()); }

private void button3_Click( object sender, EventArgs e) { //Calling Static method of the class MessageBox .Show( "Static method :: " + TestDemo .staticfx()); } } } Output: Click on: Default Constructor Button

Click on: Parameterized Constructor Button

Click on: Static method Button

Inheritance Inheritance is one of the primary concepts of object-oriented programming. Inheritance is the process by which we can inherits the properties or methods of one class into the other class. The concept behind inheritance, take the base class that contains methods and properties and inherits it into the derived class, that now contains all the members and properties of the base class as well as its own newly added members or properties. The following are the advantages of Inheritance:-

• • • •

Reuse the existence code Save time, we need not do the code verification and testing. Here, we can add and modify the methods of the existing class. Help in modularization of code. Types of Inheritance: The following are the types of inheritance exist in C# programming. Single Inheritance: Here we have single base class that is inherited by the derived class. Here the derived class has all the features of the base class and can add new features or modify existing features. The inheritance also depends on the access specifier that is used at the time of base class inheritance. Multi-level Inheritance: In the multi-level inheritance, here we having a chain of inheritance i.e. the base class A is inherited by derived class B, and it is further inherited by another derived class C. So, the feature we have in base class A, is also there in Derived class B, and all the combination features of class A and class B are there in derived class C. Multiple Inheritance: In C#, we don't have multiple inheritance where one class can inherit two base classes. So, the multiple inheritance can be done by using the concept of interfaces. Here one class can inherit one class and can implements more than one interface. Hybrid Inheritance: The hybrid inheritance can also be done through with the help of interface. Here the derived class cans implements more than two interfaces and only one class. Example: Demonstrate Inheritance

DerivedClass7.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES

{ public class parentClass7 { String str = "Parent:::" ; public parentClass7() { str = "Parent Constructor" ; } public String display() { return str; } public String Show() { return "Base Show" ; } } public class DerivedClass7 : parentClass7 { String testStr = "Derived::" ; public DerivedClass7() { testStr = "Derived Constructor" ; } public String display1() { return testStr; } public String Show1() { return base.Show(); } } } Form7.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms;

namespace cSHARPEXAMPLES { public partial class Form7 : Form { public Form7() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { DerivedClass7 obj = new DerivedClass7 (); MessageBox.Show( "Call to Parent Method :: " + obj.display()); MessageBox.Show( "Call to Derived Method :: " + obj.display1()); } private void button2_Click( object sender, EventArgs e) { DerivedClass7 obj = new DerivedClass7 (); MessageBox.Show( "Call in Derived method that further call Base method ===>" + obj.Show1()); } } } OutPut: When User Clicks On :Simple Inheritance Button

When User Clicks On :Calling Base Method in Derived Method Button

Polymorphism Polymorphism is the core concept of OOP's. Polymorphism means one name many forms. Types of polymorphism 1. Compile Time Polymorphism 2. Run Time Polymorphism Compile Time Polymorphism The compile time polymorphism, here the polymorphism is implemented during compile time, that means at the time of compilation the compiler knows where to bind the method. The compile time polymorphism can be implemented through:

• •

Method Overloading Operator Overloading Method Overloading: In complex applications written in C#, we may need many methods which do essentially similar functions but are just different enough to be considered unique. So, we can define method overloading as if two or three method in a class has same name but they differ by number of arguments or type of argument. Operator Overloading: This provides a meaningful understanding of the operation by using operator overloading. Here what we did is we overload an operator and change its meaning, so that a valuable information is send to the programmer and this help in reducing the complexity. E.g. If we need to add two matrix of 3X3

Matrix result = Matrix.Add(mat1, mat2); // this doesn't give any relevant information Run Time Polymorphism The run time polymorphism, here the compiler doesn't know which method to call at runtime. Here we can call the derived method through base class pointer at runtime. The run time polymorphism can be implemented through: Virtual – Override Keyword. Vitual function: The virtual function is used to implement runtime polymorphism; here we have same name method in the base class as well as in the derived class. We can access the derived method using the base pointer. The virtual keyword should be write in front of the base class method and in the derived class we have to write override in front of the method. For Example:Class BaseClass { Virtual void display () {//statements} } Class DerivedClass { Override void display () {//statements} }

Example: Demonstrate Polymorphism

BaseClass8.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class BaseClass8 { String str = "Base" ; public BaseClass8() { } public String display() { return str + ": BaseClass Display" ; } public virtual String show() { return str + ": BaseClass Show" ; } } } DerivedClass8.cs using System;

using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class DerivedClass8 : BaseClass8 { String str = "Derived" ; public DerivedClass8() { } public new String display() { //NEW KEYWORD is USE TO HIDE THE //SAME METHOD IN TH BASE CLASS return str + ": Display Derived" ; } public override String show() { //OVERRIDE KEYWORD IS USED IF //THE METHOD IN THE BASE CLASS IS VIRTUAL return str + ": SHOW Derived:" ; } } } Form8.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form8 : Form { public Form8() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Virtual: Polymorphism at RunTime BaseClass8 objBase = new DerivedClass8 ();

label5.Text = objBase.display(); label6.Text = objBase.show(); } private void button2_Click( object sender, EventArgs e) { BaseClass8 objBase = new BaseClass8 (); label1.Text = objBase.display(); label2.Text = objBase.show(); } private void button3_Click( object sender, EventArgs e) { DerivedClass8 objDer = new DerivedClass8 (); label3.Text = objDer.display(); label4.Text = objDer.show(); } } }

Output

Properties Properties are used to protect the field in a class by reading and writing it through the property. Here the field consists of one getter and one setter that are associated with a given field. We can access this field through this getter/setter combination. Two ways to declare property in the class

1. One way to declare:
class PropertyDemo { private String name; //Declare a field public String getName() { //Getter return name; } public void setName( String Value) {//Setter name = value; } } 2. Another way to declare: class PropertyDemo { private String name; //Declare a field

public String Name{ get{ return name;} //Getter set{ name = value;} // Setter } } Read-Only property: We can declare a property as read-only; by only have its getter. So that the user can't set the value of the field, because there is no setter for the field. Hence we restrict the user to change the value of the field at any given time. Write-Only property: We can declare a property as write-only, by only have its setter. Here the user can't access the value that is there in the field. We can manipulate the value of the field by using its setter, but we can't get the value of this field. Example: Demonstarte propery, Read-Only Property, Write Only Property.

ClsProperty9.cs using System; usingusing System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class ClsProperty9

{ private int age; private String name; private String lastName = "Dogra" ; private String address; public int getAge() { return age; } public void setAge( int Value) { age = Value; } public String getName() { return name; } public void setName( String Value) { name = Value; } //Read-Only property:Only Getter public String getLastName() { return lastName; } //Write-Only Property: Only Setter public void setAddress( String Value) { address = Value; } public String displayAddress() { return address; } } } Form9.cs

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form9 : Form { ClsProperty9 obj = new ClsProperty9 (); public Form9() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Setters Calls obj.setAge( Int16 .Parse(textBox1.Text)); obj.setName(textBox2.Text); obj.setAddress( " Chandigarh " ); //Write Only Property } private void button2_Click( object sender, EventArgs e) { //Getters Calls MessageBox .Show( "Name: " + obj.getName()); MessageBox .Show( "Age: " + obj.getAge()); MessageBox .Show( "Last Name: " + obj.getLastName());//Read //Only property MessageBox .Show( "Address: " + obj.displayAddress()); } } } Output:

Click On: Set the Value This will set the values in the class fields i.e. name, address Click On: Get the Value This will display the values that are set by the setters.

First value that we get is the name.

Second is the age value.

This field only has getter associated to it.

This field only has setter associated with it, we can Indexers

If properties are 'virtual fields', indexers are more like 'virtual arrays' . They allow a class to emulate an array, where the elements of this array are actually dynamically generated by function calls. They allow a class to be used just like an array. On the inside of a class, you manage a collection of values any way you want. These objects could be a finite set of class members, another array, or some complex data structure. The following are the advantages of the Indexers. • • Regardless of the internal implementation of the class, its data can be obtained consistently through the use of indexers. Indexers aren't differentiated by name, and a class cannot declare two indexers with the same signature. However, this does not entail that a class is limited to just one indexer. Different indexers can have different types and numbers of indexing elements (these being equivalent to method parameters, except that each indexer must have at least one indexing element, and the 'ref' and 'out' modifiers cannot be used).

Example: Demonstrate Indexers

ClsIndexers10.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class ClsIndexers10 { private String [] arrString; private int arrSize; public ClsIndexers10( int sizeofArray) { //Constructor

arrSize = sizeofArray; arrString = new String [arrSize]; for ( int i=0;i<arrSize;i++){ arrString[i] = "No Value" ; } } public string this [ int indexValue] { get { return arrString[indexValue]; } set { arrString[indexValue] = value ; } } public string [] this [ string data] { get { for ( int i = 0; i < arrSize; i++) { if (arrString[i] == data) { arrString[i] = "Hi" ; } } return arrString; } set { for ( int i = 0; i < arrSize; i++) { if (arrString[i] == data) { arrString[i] = "Hi" ; } }

} } } } Form10.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form10 : Form { static int arrSize = 10; ClsIndexers10 obj = new ClsIndexers10 (arrSize); public Form10() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Indexers Implementation : Using Integer label1.Text = "" ; obj[2] = "HHHI" ; obj[5] = "Vikrant" ; obj[9] = "Amit" ; for ( int i = 0; i < arrSize; i++) { label1.Text = label1.Text + "Indexer at " + i + obj[i] + "\n" ; } } private void button2_Click( object sender, EventArgs e) { //Indexers Implementation : Using String label1.Text = "" ; String [] arrString = obj[ "No Value" ];

for ( int i = 0; i < arrString.Length; i++) { label1.Text = label1.Text + "Indexer at " + i + obj[i] + "\n" ; } } } } Output: Click On: Indexer Implementation

Click On: Indexer – With String

Structs Structs is value-type user defined data type same as int, float, bool etc. Structs features: • • • • • • structs are value-type In structs memory allocation can be done on stack. No garbage collector required to remove structs variable because as they are value type, the memory allocated is on stack and so no memory allocated on heap, when structs variable are not in used they just fall from the stack. Structs can't have destructors. Structs can't inherit another class or structs. This means there is no concept of inheritance in structs. Structs may inherit multiple interfaces. Interface is a reference type and any class or structs that implements interface must override all the methods that are there in the interface.

Example: Demonstrate Structs

ClsStruct11.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { interface ITest { string Test(); } struct Rectangle : ITest { public int length; public int breath; public int height; public Rectangle( int length, int breath, int height) { this .length = length; this .breath = breath; this .height = height; } public Rectangle Add( Rectangle rect) { Rectangle newRect; newRect.length = length + rect.length;

newRect.breath = breath + rect.breath; newRect.height = height + rect.height; return newRect; } public string Test() { return "Implements Interface in structs" ; } } class ClsStruct11 { public String display() { Rectangle rect1 = new Rectangle (10, 20, 30); Rectangle rect2 = new Rectangle (110, 120, 130); Rectangle rect3; rect3 = rect1.Add(rect2); return "Length :: " + rect3.length + "\n Breadth :: " + rect3.breath + "\n Height :: " + rect3.height; } public string print() { Rectangle rect1 = new Rectangle (10, 20, 30); return rect1.Test(); } } }

Form11.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form11 : Form { public Form11() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { // Structs Implementation label1.Text = "" ; ClsStruct11 obj = new ClsStruct11 (); label1.Text = obj.display(); } private void button2_Click( object sender, EventArgs e) { // Structs Implementing Interface label2.Text = "" ; ClsStruct11 obj = new ClsStruct11 (); label2.Text = obj.print(); } } }

Output: Clicking On Both the Buttons: The concept behind the structs will be executed and displayed.

Interfaces An interface looks like a class, but has no implementation. Aninterface is a C# reference type with members that do not have implementations. Interfaces only have method signatures. The following are the properties of the interfaces:• • • • • It contains definitions of events , indexers , methods and/orproperties . The reason interfaces only provide definitions is because they are inherited by classes and structs , which must provide an implementation for each interface member defined. Interfaces are like protocol or standard that needs to be maintained by the classes or structs that are implementing that interface. We can have final variables and abstract methods in interface. This means the classes or structs that are implementing interfaces need to provide the body for all the methods that are there in interfaces. No need to provide the access specifier for method that is there in interface, all the methods are public.

We have the concept of inheritance in interface. One interface can extends another interface. Syntax: Interface InterfaceName { // method signature } Class implementing the Interfaces. Class clsTest: ITestInterface { // method defined here

} Structs Implementing Interface. struct strTest: IstructsInterface { // method defined here } Interfaces may inherit other interfaces. Example: Demonstrate Interfaces

ClsInterface12.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { interface IParentInterace { String display(); } interface IChildInterface : IParentInterace { String Show(); }

class ClsInterface12 : IChildInterface { String str = "Hi" ; public ClsInterface12( String pStr) { str = pStr; } public String Test() { return str; } public String display() { return str + " : Display Of Base Interface" ; } public String Show() { return str + " : Show Of Child Interface" ; } } } Form12.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form12 : Form { public Form12() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e)

{ ClsInterface12 obj = new ClsInterface12 ( "Hello" ); label1.Text = obj.Test(); label2.Text = obj.display(); label3.Text = obj.Show(); } private void Form12_Load( object sender, EventArgs e) { label1.Text = "" ; label2.Text = "" ; label3.Text = "" ; } } } Output: Click On: Interface Executed Button

Delegates A delegate in C# language allows us to reference a method. The other way to say this delegate is a function pointer. The function pointer is same as we have pointer to an address now in this case we have pointer to a method address. There are two types of delegates :• • Single-Cast Delegate:- Here the delegate will refer to or point to single method or we can Say that the pointer is to single method from the delegate. Multi-Cast Delegate:-In the multi-cast delegate, the delegate refer to or point to more than One method at runtime. Delegates features:

• • • • •

Delegate is a function pointer. Delegate declaration is same as method declaration, except they have delegate modifier in front of it. The method that a delegate refers or pointing to must have same signature as of delegate method. To use a delegate, we have to create the instance of the delegate and pass the method that it is pointing too or referring to. Invoke (), This method can be used to invoke the delegate. The delegates can be declared by adding a delegate keyword in front of any method. For Example- delegate void Mydelegate();

Note:- This is declaration of the delegate and it specifies the method signature that it is pointing or referring. This means the signature of the method that a delegate pointing has no parameter and will not return any thing. But this is an example and we can say the delegate can refer to any type of method. Example: Demonstrate Delegates

ClsDelegate13.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class ClsDelegate13 { delegate void Mydelegate (); static String str = "" ; static String sd = "" ; public String singlecastfx()

{ sd = "" ; sd = "Single Cast Delegate ==> " ; Mydelegate d = null ; d += new Mydelegate (singlecastdelegatefx); d.Invoke(); sd = sd + " :: appender" ; return sd; } public String multicastfx() { str = "" ; str = "starting Value ==> " ; Mydelegate d = null ; d += new Mydelegate (firstfx); d += new Mydelegate (secondfx); d(); str = str + " :: appender" ; return str; } public void firstfx() { str = str + " :: firstfx" ; } public void secondfx() { str = str + " :: secondfx" ; } public void singlecastdelegatefx() { sd = sd + " ::singlecastdelegatefx" ; } } } Form13.cs using System; using System.Collections.Generic;

using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form13 : Form { public Form13() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Multi-cast delegate ClsDelegate13 objDelegate = new ClsDelegate13 (); MessageBox .Show(objDelegate.multicastfx()); } private void button2_Click( object sender, EventArgs e) { //Single-cast delegate ClsDelegate13 objDelegate = new ClsDelegate13 (); MessageBox .Show(objDelegate.singlecastfx()); } } } Output: Clicking On: Single-cast Delegate Button

Clicking On: Mutil-cast Delegate Button

Exception Handling Exception Exceptions are unforeseen errors that happen in your programs. Programmers always detect and most of the time writes correct code to avoid all the errors or exceptions that can distract the execution of the code and cause unwanted results. However, there are times when you don't know if an error will occur. For example, you can't predict when you'll receive a file I/O error, run out of system memory, or encounter a database error. These things are generally unlikely, but they could still happen and you want to be able to deal with them when they do occur. This is where exception handling comes in. When exceptions occur, they are said to be "thrown". What is actually thrown is an object that is derived from the “S ystem. Exception” class Try/catch and Finally Block: This is a way we can handle exceptions in C#. • • • Try Block:- In this block, we include all the suspected code. This means the code that is most likely to cause exception. Catch Block:- In this block we include all handlers that will be take care of exception that occurs. We can have number of catch blocks associated to single try block. Finally Block : The finally block contains the cleanup code that we needed whether the code is succeed or not. Most of the time we write a code that will deal locate the memory that we associated in the beginning like memory allocated to connection object.

Example: Exception Handling

Form14.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace cSHARPEXAMPLES { public partial class Form14 : Form { public Form14() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Simple Try/Catch Block int dividebyZero = 0; int a = 20; int b = 0; try { dividebyZero = (a / b); }catch ( DivideByZeroException ex) {

MessageBox .Show( "2nd EXCEPTION :: " + ex.ToString()); }catch ( Exception ex) { MessageBox .Show( "EXCEPTION :: " +ex.ToString()); } } private void button2_Click( object sender, EventArgs e) { //Try,Catch and Finally Block FileStream outputStream = null ; FileStream inputStream = null ; try { outputStream = File.OpenWrite( "DestinationFile.txt" ); inputStream = File.OpenRead( "BogusInputFile.txt" ); }catch ( Exception ex) { MessageBox .Show(ex.ToString()); }finally { if (outputStream != null ) { outputStream.Close(); MessageBox .Show( "OutputStream Closed." ); } if (inputStream != null ) { inputStream.Close(); MessageBox .Show( "InputStream Closed." ); } } } } }

Output: Click On: Simple Try/catch Block Button

Click On: Try/catch and Finally Block Button

Attributes Attributes are elements that allow you to add declarative information to your programs. This declarative information is used for various purposes during runtime and can be used at design time by application development tools. Attributes are also used extensively in securing .NET assemblies, forcing calling code to be evaluated against pre-defined security constraints. Attribute declared using the ‘[‘and ‘]' brackets before any type declaration. The following are the advantages the attributes provide: • Declarative information to your program

• • • •

This information can be used at runtime or at compile time by programmers. DllImportAttribute: This attribute provide information to communicate with the Win32 libraries. ObsoleteAttribute: This provides compile time information to the developer that this method is now deprecated. Attribute add what is called metadata to your program.

• •

Attributes are classes that can be written in C# and used to decorate your code with declarative information. Many attributes have parameter lists that allow inclusion of additional information that customizes a program even further. Examples of Attributes:[ Obsolete ] public String firstDeprecatedFX(){} [ ObsoleteAttribute ] public String secondDeprecatedFX(){} Obsolete ( "Don't Use This Method." )] public String thirdDeprecatedFX() [ STAThread ] static void Main () {} Note:- This attribute declare that this is the entry point for the application. This indicates that C# program should communicate with unmanaged COM code using the single threading apartment. The parameter provide additional information about the attribute Example To Demonstrate Attributes The following is the screen appeared when run the form 15 program in the source.

ClsAttribute15.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class ClsAttribute15 { [ Obsolete ] public String firstDeprecatedFX()

{ return "Call firstDeprecatedFX" ; } [ ObsoleteAttribute ] public String secondDeprecatedFX() { return "Call secondDeprecatedFX" ; } [ Obsolete ( "Don't Use This Method." )] public String thirdDeprecatedFX() { return "Call thirdDeprecatedFX" ; } } } Form15.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form15 : Form { public Form15() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Attribute : use to create method deprecated ClsAttribute15 obj = new ClsAttribute15 (); obj.firstDeprecatedFX(); //Deprecated Methods

obj.secondDeprecatedFX(); MessageBox .Show(obj.thirdDeprecatedFX()); } } } Output: Clicking On: Attribute fire up Button

Enums An enumeration is a special kind of value type limited to a restricted and unchangeable set of numerical values. Enums are strongly typed constants. They are essentially unique types that allow you to assign symbolic names to integral values. Advantages of Enums:• • • • • • In the C# tradition, they are strongly typed, meaning that an enum of one type may not be implicitly assigned to an enum of another type even though the underlying value of their members are the same. By default, these numerical values are integers, but they can also be longs, Bytes, etc. When you define an enumeration you provide literals which are then used as Constants for their corresponding values. Values specified in enumeration are static. These values are final and you can't change the value at runtime. The System.Enum BCL type is the base class of enum types and contains methods that allow you to work with enums in different ways, such as working with a list of names or values, converting from value to name, and converting from name to value. Syntax enum enumname { //values} Example:enum DayOfWeek { Monday=2, Tuesday, Wednesday, Thursday=10, Friday, Saturday,

Sunday } Note:• • • • The first literal, is unassigned then it value is set to 0. For any other literal, if the value is unassigned then the value set is greater than the value of the preceding literal. By this the value of Monday is set to 0 and the value of Sunday is 6. We can also specify the value to the literal in the enums. Note:- Here the value will be Monday-2, Tuesday-3, Wednesday-4 and Thursday10, Friday-11, Saturday-12, Sunday-13.

Example: Demonstrate Enums

ClsEnum16.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { enum DayOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

enum ValuesEnum : byte { One = 1, two, three=5, four, five } class ClsEnum16 { public String GetvalueEnteredByUser( int enteredValue) { //user entered value ValuesEnum valuesEnum = ( ValuesEnum )enteredValue; String str = "" ; switch (valuesEnum) { case ValuesEnum .One: str = "FIRST" ; break ; case ValuesEnum .two: str = "SECOND" ; break ; case ValuesEnum .three: str = "THIRD" ; break ; case ValuesEnum .four: str = "FOURTH" ; break ; case ValuesEnum .five: str = "FIFTH" ; break ; default : str = "default" ; break ; } return str; } public String CreateAndUseEnumType(){ DayOfWeek dayofWeek = DayOfWeek .Thursday; //DayOfWeek dayofWeek = (DayOfWeek)4; String strDay = "" ; switch (dayofWeek) { case DayOfWeek .Monday: strDay = "Monday" ;

break ; case DayOfWeek .Tuesday: strDay = "Tuesday" ; break ; case DayOfWeek .Wednesday: strDay = "Wednesday" ; break ; case DayOfWeek .Thursday: strDay = "Thursday" ; break ; case DayOfWeek .Friday: strDay = "Friday" ; break ; case DayOfWeek .Saturday: strDay = "Saturday" ; break ; case DayOfWeek .Sunday: strDay = "Sunday" ; break ; } return strDay; } } } Form16.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form16 : Form { public Form16() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Create and use Enums

ClsEnum16 obj = new ClsEnum16 (); MessageBox .Show(obj.CreateAndUseEnumType()); } private void button2_Click( object sender, EventArgs e) { //Enter Enum Value From User int _userEnterValue = Int32 .Parse(textBox1.Text); ClsEnum16 obj = new ClsEnum16 (); MessageBox.Show(obj.GetvalueEnteredByUser(_userEnterValue); } } } Output Click On: Enter Enum value from user Button

Click On: Create and Use Enums Type

Encapsulation Encapsulation is the process of wrapping up of data and members in a class. Encapsulation provides the way to hide data from the external usage. This is important in the scenario when we don't want our precious data to be used or manipulated by external user. Encapsulation is an object-oriented principle of hiding the internal state and behavior of an object, making your code more maintainable. Advantages of Encapsulation • • • • Data-hiding through the access specifier private. Reduce coupling between objects. Increases the maintainability of code. Wrapping up of data variables and members inside the class. The following table will give the description of the Access modifiers available in C#. Access Modifier Description (who can access)

Private

Private members can be accessed within the class where they are declared. We can't access private members outside the class, not even with the object of the class. This basically provides the concept of Data-Hiding.

Protected

Protected members scope can be outside the class but only limited to the immediate derived class that is inheriting the base class where the protected members resides. The protected can be used by the members of same class or the members of derived class.

Internal

Here the internal members are accessible within the same assembly. If you don't specify any modifier, by default it is of internal type.

Protected Internal

Here either accessed in the same assembly or the derived assembly also. This is basically a combination of protected and internal access modifiers.

Public

Public members can be accessed anywhere. No restriction associated with this access modifier.

Sealed Class The sealed keyword provides the restriction that no other class in the context can inherit this class. By this, we can make our class not to be inherited by other class. If the class tries to inherit the class that is declared as sealed, the compile time error occurs. 1] Class declared as sealed sealed class ClsSealed17 {// Any members } Abstract Class The class declared with abstract keyword, this means the class is only provide the essential elements and not including the background details. Abstraction is the process of including the essential elements and hiding the details. In layman terms, we can say that a computer is the abstract form, because we are not aware of the internal technicality. If the class is declared as abstract, we have to give the body to all the methods that are declared as abstract. 1] Class declared as abstract abstract class clsAbstractDemo{ // This can contains abstract or concrete methods. } 2] Abstract Members public abstract string displayname(); Note:- The abstract methods can only include the signature of the method.

Example: Demonstrate Encapsulation

ClsEncapsulation17.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class Customer { public void CustomerRecord() { AddNewRecord(); UpdateExistingRecord(); DeleteRecord(); } protected virtual string AddNewRecord() { return "Base: AddNewRecord" ; } //ADD NEW RECORD protected virtual string UpdateExistingRecord() { return "Base: UpdateExistingRecord" ; } //UPDATE EXISTING RECORD protected virtual string DeleteRecord() { return "Base: DeleteRecord" ; } //DELETE EXISTING RECORD

} class ClsEncapsulation17 : Customer { private string name = "" ; //Can't Access Outside the Class private string address = "" ; //Can't Access Outside the Class private string pri_Display() //Can't Access Outside the Class { return "This method can't be access outside the class" ; } public string CustomerName { //Public Property get { return name; } set { name = value ; } } public string CustomerAddress //Public property { get { return address; } set { address = value ; } } public string CombineDisplay() //Public Method { return CustomerName + " :::" + CustomerAddress; } protected override string AddNewRecord() //Protected Method { return "protected method :: AddNewRecord" ; } protected override string UpdateExistingRecord() //Protected Method { return "protected method :: UpdateExistingRecord" ; } protected override string DeleteRecord() //Protected Method { base .DeleteRecord(); return "protected method :: DeleteRecord" ; } public string combineString() {

string cmbStr = "" ; cmbStr = cmbStr + AddNewRecord() + "\n" ; cmbStr = cmbStr + UpdateExistingRecord() + "\n" ; cmbStr = cmbStr + DeleteRecord(); return cmbStr; } } } ClsSealed17.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { sealed class ClsSealed17 { private string name = "" ; public string CustomerName { get { return name; } set { name = value ; } } public string displayName() { return name; } } //Can't inherited a Sealed Class class derivedClass //: ClsSealed17 { } } ClsAbstract17.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES

{ abstract class clsAbstractDemo { private int _number = 10; public string _name = "" ; public abstract string displayname(); // Abstract method public int calcTotal() //Concreate Method { return (_number * 10); } } class ClsAbstract17 : clsAbstractDemo { public override string displayname() { //Abstract Method return "Abstract Method Provide Body in Derived Class" ; } } } Output Click On: Private Members Button Click On: Public Members Button

Click On: Protected Members Button

Click On: Sealed

Click On: Abstract

Parameter Passing in C sharp A method's parameters are the types that get passed to it when the method is called. The list of parameters begins by specifying zero or more 'fixed parameters', and it may finish by specifying a single parameter-array. This latter element declared using the 'params' keyword - means that it is possible to pass an arbitrary number of types to a single method. Syntax: [Modifier] parameter-type parameter-identifier • • • [Modifier]: This is optional and can be either 'ref' or 'out'. Parameter-type: This declares the type of the parameter. Parameter-identifier: The name of the parameter. There are 3 type of parameter that are passed to the method • • • Passing by Value Passing by Reference ‘Output' Parameter. Passing By Value: The parameter modifiers 'ref' and 'out' relate to how the parameter is passed into the method. Where neither of these modifiers is used, the parameter is passed in 'by value'. By default we are passing variable by value. Here the new copy of the variable is send to the called method. So changes done to the variables are not reflected on the actual parameter. Syntax: passValueByValueType(_initialValue); //Call a method private void passValueByValueType( int iV) { iV = 20; } Passing By Reference: In C# we can pass variables into methods 'by reference'. Where a variable is passed by reference, the 'ref' modifier must be used both in the method head and the

method invocation (illustrated by the next code block). The changes made to the formal argument will reflect on the actual argument. Syntax: passValueByReferenceType( ref _initialValue); //Calling Method private void passValueByReferenceType( ref int iV) { iV = 20; } ‘Output' parameter: Where a method parameter is defined (and invoked) using the 'out' modifier, it is passed by reference. The difference between the 'out' and the 'ref' modifier is this: a parameter modified by the 'out' keyword need not be assigned a value before being passed into the method, but must be assigned a value in the method. Syntax: passValueByOutParameter( out _initialValue, out _bValue);//Calling ‘Params' Modifier One can pass an arbitrary number of types to a method by declaring a parameter array with the 'params' modifier. Syntax: public int getTheTotalUsingParam( params int [] intArr) Example: Demonstrate Parameter Passing in C#

Form18.cs: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form18 : Form { public Form18() { InitializeComponent(); } private void btnValue_Click( object sender, EventArgs e) { //Value int _initialValue = Int16 .Parse(textBox1.Text); MessageBox .Show( "Before Calling " + _initialValue.ToString()); passValueByValueType(_initialValue); textBox1.Text = _initialValue.ToString(); MessageBox .Show( "After Calling " + _initialValue.ToString()); } private void btnReference_Click( object sender, EventArgs e) { //Reference int _initialValue = Int16 .Parse(textBox2.Text); MessageBox .Show( "Before Calling " + _initialValue.ToString()); passValueByReferenceType( ref _initialValue); textBox2.Text = _initialValue.ToString(); MessageBox .Show( "After Calling " + _initialValue.ToString()); } private void btnOut_Click( object sende { //Out bool _bValue; int _initialValue = Int16 .Parse(textBox3.Text); MessageBox .Show( "Before Passing " + _initialValue.ToString()); passValueByOutParameter( out _initialValue, out _bValue); r, EventArgs e)

textBox3.Text = _initialValue.ToString(); MessageBox .Show( "After getting the value " + _initialValue.ToString()); } private void passValueByReferenceType( ref int iV) { iV = 20; } private void passValueByValueType( int iV) { iV = 20; } private void passValueByOutParameter( out int iV, out bool bValue) { bValue = false ; iV = 2; if (iV > 40) bValue = true ; else bValue = false ; iV = iV * 20; } } } OutPut:

Clicking On:- Passing Parameter By Value

Clicking On:- Passing Parameter By Reference

Clicking On:- Passing Parameter By Out

Method Overloading Each method has a signature. The signature comprises the method's name and its parameters (excepting their names), but not the method's return type. Method Overloading is one of the forms of polymorphism. This is compile time polymorphism because at compile time the compiler able to distinguish between the methods that is declared with same name but different number of arguments. Conditions which should be fulfilled for Method overloading: • • • Method Name should be same for all the methods that are participating in method Overloading. The number of arguments or type of arguments should be different. No class allowed two methods to have same signature. Note:- Like methods constructors can also be overloaded.

Example: Demonstrate Method Overloading

ClsOverLoading19.cs using System; using System.Collections.Generic; using System.Text; namespace cSHARPEXAMPLES { class ClsOverLoading19 { int a; int b; //Constructor OverLoading public ClsOverLoading19() { a = 10; b = 20; } public ClsOverLoading19( int a, int b) { this .a = a; this .b = b;} public ClsOverLoading19( ClsOverLoading19 obj) { this .a = obj.a; this .b = obj.b; }

public int result() { return a + b; } //Method OverLoading public string display() { return "single method with no parameter" ; } public string display( string strA) { return strA; } public string display( string strA, string strB) { return strA + ":: "+ strB ; } public string display( string strA, int intA) { return strA + " :: " + intA.ToString() ;} } } Form19.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cSHARPEXAMPLES { public partial class Form19 : Form { public Form19() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { // Call Single Parameter Method ClsOverLoading19 obj = new ClsOverLoading19 (); MessageBox .Show(obj.display()); } private void button2_Click( object sender, EventArgs e) { //Call Parameterized Method ClsOverLoading19 obj = new ClsOverLoading19 (); MessageBox .Show(obj.display( "vikrant" )); MessageBox .Show(obj.display( "Vikrant" , "Dogra" )); MessageBox .Show(obj.display( "Hi I am " ,27)); }

private void button3_Click( object sender, EventArgs e) { //Constructor overloading ClsOverLoading19 obj = new ClsOverL ClsOverLoading19 obj2 = obj1; MessageBox .Show( "Default Constructor result " +obj.result()); MessageBox .Show( "Parameterized Constructor result " +obj1.result()); MessageBox .Show( "Copy Constructor result " + obj2.result()); } } } Output: Click On: Calling Single Parameter Method oading19 (); ClsOverLoading19 obj1 = new ClsOverLoading19 (30,40);

Click On: Call Parameterized Method

Click On: Constructor Overloading

Database Interaction Using C sharp C# is a language. The classes defined in the class libraries are used to communicate with the database and we are using C# language to interact with the database. In Ado.Net components we have number of classes that are responsible to communicate with the database. Introducing ADO.NET Ado.Net is an Object-oriented set of libraries that allows you to interact with data sources. Following are the data providers in ado.net.

1. System.Data.SqlClient:- contains classes that communicate with Ms 2. 3. 4.
SQLServer. System.Data.OracleClient:- communicate with Oracle. System.Data.Oledb:- communicate to a data source that has an OLEDB provider. System.Data.Odbc:- communicate to a data source that has an ODBC provider

ADO.NET OBJECTS Ado.net includes many objects you can use to work with data. Some of the primary objects are as follows:-

1. SqlConnection:- To interact with a database, you must have a connection to

2. 3.

4.

5.

it. The connection objects helps identifying the database server, database name, user name and password. The connection object is used by command objects. SqlCommand:- You can use this object to send SQL statements to the database. This can represent a SQL Statement or stored procedure. SqlDataReader:- The data reader object allows you to obtain the results of a Select statement from a command object. The data returned from a data reader is a fast forward-only stream of data. This fetch data in a sequential manner. DataSet:- You can imagine dataset as a database. This contain multiple datatable objects, which further contains columns and rows objects. We can also define relationship among tables in the dataset. This is disconnected approach. SqlDataAdapter:- The SqlDataAdapter is used to fill dataset object when reading the data and writes in a single batch when persisting changes back to the database. A data adapter contains a reference to the connection object and opens and closes the connection automatically when reading from or writing to the data base. The data adapter contains 4 command objects i.e. SELECT, UPDATE, DELETE, and INSERT

Example: Demonstrate Database Interaction This example will provide the interaction with the database. The user will enter his credentials, if the user is valid and the credentials matched with the database, he is able to view all the other users' credentials that are valid.

Form20.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace cSHARPEXAMPLES { public partial class Form20 : Form { public Form20() { InitializeComponent(); } private void btnLogin_Click( object sender, EventArgs e)

{ //Login try { SqlConnection con = null ; string conStr = "" ; int _ExistFlag = 0; conStr = "Data Source=localhost;initial catalog=TestDB;uid=sa;pwd=sa"; con = new SqlConnection (conStr); _ExistFlag = fnUserExists(con,txtName.Text,txtPassword.Text); if (_ExistFlag == 0) { //Not A Valid User MessageBox .Show( "Not A Valid User" ); } else { // If Valid user Than Display all the Valid User that are there in the DataBase MessageBox .Show( "Valid User :: Display All the Valid User" ); fillgridWithValidUser(con); } } catch ( Exception ex) { MessageBox .Show( "Exception Occurs.........." +ex.Message); } finally { txtName.Text = "" ; txtPassword.Text = "" ; } } /* * Function: Whether a Valid User or Not * Depending on the creadentials enter by user */ private int fnUserExists( SqlConnection con, string strUserName, string strPassword) {

SqlCommand cmd = null ; int _ExistFlag = 0; cmd = new SqlCommand ( "select count(*) from tblLogin where UserName=@UserName and password=@Password " , con); cmd.Parameters.Add( "@UserName" ,SqlDbType.NVarChar).Value = strUserName; cmd.Parameters.Add( "@Password" ,SqlDbType.NVarChar).Value = strPassword; cmd.CommandType = CommandType .Text; con.Open(); _ExistFlag = Int16 .Parse(cmd.ExecuteScalar().ToString()); con.Close(); return _ExistFlag; }

/*
* if the Credentials Enter By user is Valid: * Then Display List Of all The Other Valid Users. */ private void fillgridWithValidUser( SqlConnection con) { SqlDataAdapter ada = null ; DataSet dst = null ; ada = new SqlDataAdapter ( "select * from tblLogin" , con); dst = new DataSet (); ada.Fill(dst, "Login" ); dataGridView1.DataSource = dst.Tables[0].DefaultView; } } } Output: On Click: Login Button

Operator Overloading in C sharp –1 There are varieties of operators available for use in C#. The C# language defines the behavior of these operators when used in an expression with the C# built-in data types. C# gives user the flexibility to change the default behaviour of the operators that means, user can define the behavior of many of the standard operators with his own structures and classes. Suppose, for example, that you're writing a class that manages a set of records read from a database. If another piece of code has two objects of your class, it may want to write an expression that joins the records together into a third object. This sounds like an addition operation, and it seems natural for other pieces of code to write code like the following: Records Records1; Records Records2; Records Records3; Records3 = Records1 + Records2; Your Records class would include a method that specifies "how objects of the class will behave when used in an expression with the addition operator. These methods

are called user-defined operator implementations , and the object-oriented terminology for defining operator behavior in a class is called operator overloading . Note: All operator overloading methods must be declared with both the static and public keywords. Overloading Unary Plus /Unary Minus: If you need to overload the unary plus operator, the following characteristics must be enjoyed by the method that is used to overload the unary plus. • • • • A return type of your choice The keyword operator The operator being overloaded A parameter list specifying a single parameter of the type of class or structure containing the overloaded operator method Overloading Prefix Increment and Decrement Operator: If you need to overload the prefix increment or prefix decrement operators in your class or structure, define a method with the following characteristics: • • • • A return type specifying the type of class or operator method The keyword operator The operator being overloaded A parameter list specifying a single parameter containing the overloaded operator method Example: Demonstrate Overloading of Unary Plus, Unary Minus, Prefix Increment, Prefix Decrement. Overloading Unary Plus using System; using System.Collections.Generic; using System.Text; namespace _CSharpApplication { class ClsOverLoadUnaryPlus { public int X; public int Y; public static ClsOverLoadUnaryPlus operator +(ClsOverLoadUnaryPlus RValue) { ClsOverLoadUnaryPlus NewObj = newClsOverLoadUnaryPlus (); if (RValue.X < 0) NewObj.X = -(RValue.X); else NewObj.X = RValue.X;

if (RValue.Y < 0) NewObj.Y = -(RValue.Y); else NewObj.Y = RValue.Y; return NewObj; } } } Overloading Unary Minus using System; using System.Collections.Generic; using System.Text; namespace _CSharpApplication { class ClsOverLoadingUnaryMinus { public int X; public int Y; public static ClsOverLoadingUnaryMinus operator – (ClsOverLoadingUnaryMinus RValue) { ClsOverLoadingUnaryMinus objNew = newClsOverLoadingUnaryMinus (); if (RValue.X > 0) objNew.X = -(RValue.X); else objNew.X = RValue.X; if (RValue.Y > 0) objNew.Y = -(RValue.Y); else objNew.Y = RValue.Y; return objNew; } } } Overloading Prefix Increment using System; using System.Collections.Generic;

using System.Text; namespace _CSharpApplication { class ClsOverloadingIncrement { public int X; public int Y; public static ClsOverloadingIncrement operator ++(ClsOverloadingIncrement RValue) { ClsOverloadingIncrement objIncrement = new ClsOverloadingIncrement (); objIncrement.X = RValue.X + 1; objIncrement.Y = RValue.Y + 1; return objIncrement; } } } Overloading Prefix Decrement using System; using System.Collections.Generic; using System.Text; namespace _CSharpApplication { class ClsOverLoadingDecrement { public int X; public int Y; public static ClsOverLoadingDecrement operator – ( ClsOverLoadingDecrement RValue) { ClsOverLoadingDecrement objDecrement = new ClsOverLoadingDecrement (); objDecrement.X = RValue.X - 1; objDecrement.Y = RValue.Y - 1; return objDecrement; } } } Form2.cs

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace _CSharpApplication { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Overloading Unary Plus ClsOverLoadUnaryPlus objUnaryPlus = new ClsOverLoadUnaryPlus (); objUnaryPlus.X = -100; objUnaryPlus.Y = 200; MessageBox.Show((objUnaryPlus.X).ToString()); MessageBox.Show((objUnaryPlus.Y).ToString()); objUnaryPlus = +objUnaryPlus; MessageBox.Show((objUnaryPlus.X).ToString()); MessageBox.Show((objUnaryPlus.Y).ToString()); } private void button2_Click( object sender, EventArgs e) { //Overloading Unary Minus (); ClsOverLoadingUnaryMinus objUnaryMinus = new ClsOverLoadingUnaryMinus objUnaryMinus.X = -10; objUnaryMinus.Y = 20; MessageBox.Show((objUnaryMinus.X).ToString()); MessageBox.Show((objUnaryMinus.Y).ToString()); objUnaryMinus = -objUnaryMinus; MessageBox.Show((objUnaryMinus.X).ToString()); MessageBox.Show((objUnaryMinus.Y).ToString());

} private void button3_Click( object sender, EventArgs e) { //Overlading Prefix Increment ClsOverloadingIncrement objIncrement = new ClsOverloadingIncrement (); objIncrement.X = 100; objIncrement.Y = 200; MessageBox.Show((objIncrement.X).ToString()); MessageBox.Show((objIncrement.Y).ToString()); objIncrement = ++objIncrement; MessageBox.Show((objIncrement.X).ToString()); MessageBox.Show((objIncrement.Y).ToString()); } private void button4_Click( object sender, EventArgs e) { //Overloading Prefix Decrement ClsOverLoadingDecrement objDecrement = new ClsOverLoadingDecrement (); objDecrement.X = 100; objDecrement.Y = 200; MessageBox.Show((objDecrement.X).ToString()); MessageBox.Show((objDecrement.Y).ToString()); objDecrement = --objDecrement; MessageBox.Show((objDecrement.X).ToString()); MessageBox.Show((objDecrement.Y).ToString()); } } } Output:

Click on Overloading Unary Plus:

Click on Overloading Unary Minus:

Click on Prefix Increment:

Click on Prefix Decrement:

Operator Overloading in C sharp –2 Overloading Boolean Operator: If you need to overload the true or false operators in your class or structure, define a method with the following characteristics: • • • • A return type of bool The keyword operator The operator being overloaded A parameter list specifying a single parameter of the type of class or structure containing the overloaded operator method Overloading Conversion Operator: You can also write operator overload methods that convert one type into another type. If you need to define a new conversion operator in your class or structure, define a method with the following characteristics: • • • • The keyword implicit if the conversion is to be treated as an implicit conversion, or the keyword explicit if the conversion is to be treated as an explicit conversion The keyword operator A type specifying the target type of the conversion A parameter list specifying the source type of the conversion Overloading Binary Operators: The operators that fall under this category are : Addition, Subtraction, Division, Multiplication, Remainder, AND, OR, Exclusive OR, Shift left, Shift Right, Equality, Inequality, Greater than, less than. If you need to overload any of the binary

operators in your class or structure, define a method with the following characteristics: • • • • A return type of your choice The keyword operator The operator being overloaded A parameter list specifying two parameters, at least one of which must be of the type of class or structure containing the overloaded operator method Example: Demonstrate Boolean Overloading, Conversion Overloading and Binary Operators Overloading ClsOverloadingBooleanOpertors.cs using System; using System.Collections.Generic; using System.Text; namespace _CSharpApplication { class ClsOverloadingBooleanOpertors { public int X; public int Y; public static bool operator true ( ClsOverloadingBooleanOpertors RValue) { if ((RValue.X == 0) && (RValue.Y == 0)) return true ; return false ; } public static bool operator false ( ClsOverloadingBooleanOpertors RValue) { if ((RValue.X == 0) && (RValue.Y == 0)) return false ; return true ; } } } ClsOverloadingConversion.cs using System; using System.Collections.Generic; using System.Text;

namespace _CSharpApplication { class ClsOverloadingConversion { public int X; public int Y; public static implicit operator double ( ClsOverloadingConversion RValue) { double total_Distance; double total_Sum; total_Sum = (RValue.X * RValue.X) + (RValue.Y * RValue.Y); total_Distance = System. Math .Sqrt(total_Sum); return total_Distance; } } } ClsOverloadingEqualityInequality.cs using System; using System.Collections.Generic; using System.Text; namespace _CSharpApplication { class ClsOverloadingEqualityInequality { public int X; public int Y; public static bool operator ==( ClsOverloadingEqualityInequality objFirst, ClsOverloadingEqualityInequality objSecond) { if (objFirst.X != objSecond.X) return false ; if (objFirst.Y != objSecond.Y) return false ; return true ; } public override bool Equals( object o) {

return true ; } public override int GetHashCode() { return 0; } public static bool operator !=( ClsOverloadingEqualityInequality objFirst, ClsOverloadingEqualityInequality objSecond) { if (objFirst.X != objSecond.X) return true ; if (objFirst.Y != objSecond.Y) return true ; return false ; } } } Form3.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace _CSharpApplication { public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Overloading True and False operator ClsOverloadingBooleanOpertors objBoolean = new ClsOverloadingBooleanOpertors (); objBoolean.X = 20;

objBoolean.Y = 30; if (objBoolean) MessageBox.Show( "The point is at the origin." ); else MessageBox.Show( "The point is not at the origin." ); } private void button2_Click( object sender, EventArgs e) { //Overloadable Conversion Operator double conDistance; (); ClsOverloadingConversion objConversion = new ClsOverloadingConversion objConversion.X = 100; objConversion.Y = 200; conDistance = objConversion; MessageBox.Show(conDistance.ToString()); } private void button3_Click( object sender, EventArgs e) { //Overloading Equality/Inequality Operator ClsOverloadingEqualityInequality MyFirstPoint = new ClsOverloadingEqualityInequality (); ClsOverloadingEqualityInequality MySecondPoint = new ClsOverloadingEqualityInequality (); ClsOverloadingEqualityInequality MyThirdPoint = new ClsOverloadingEqualityInequality (); MyFirstPoint.X = 100; MyFirstPoint.Y = 200; MySecondPoint.X = 500; MySecondPoint.Y = 750; MyThirdPoint.X = 100; MyThirdPoint.Y = 200; if (MyFirstPoint == MySecondPoint) MessageBox.Show( "MyFirstPoint and MySecondPoint are at the same coordinates." ); else MessageBox.Show( "MyFirstPoint and MySecondPoint are not at the same coordinates." ); if (MyFirstPoint == MyThirdPoint) MessageBox.Show( "MyFirstPoint and MyThirdPoint are at the same coordinates." );

else MessageBox.Show( "MyFirstPoint and MyThirdPoint are not at the same coordinates." ); } } } Output:

Clicking on Overloading True/False Operator

Clicking on Overloading Conversion Operator

Clicking on Overloading Equality/Inequality Operator

Sockets In socket-based network programming, you do not directly access the network interface device to send and receive packets. Instead, an intermediary file descriptor is created to handle the programming interface to the network. The special file descriptors used to reference network connections are called sockets . The socket defines the following:

A specific communication domain, such as a network connection or a Unix Interprocess Communication (IPC) pipe

• •

A specific communication type, such as stream or datagram A specific protocol, such as TCP or UDP After the socket is created, it must be bound to either a specific network address or port on the system, or to a remote network address and port. Once the socket is bound, it can be used to send and receive data from the network. Network Addresses After the socket is created, it must be bound to a network address/port pair. UNIX offers an IP-specific address structure, sockaddr_in , which uses the following elements. Using the sockaddr_in structure requires placing the appropriate IP address and port values in the proper data element.

1. 2. 3. 4.

sin_family An address family, defined as a short type sin_port A port number, defined as a short type sin_addr An address, defined as a long type (4-byte) IP address sin_data 8 bytes of padding.

.NET defines two classes in the System.Net namespace to handle various types of IP address information.The classes are IPAddress and IPEndPoint IPAddress object is used to represent a single IP address. This value can be used in the various socket methods to represent the IP address. IPAddress Methods:Description

Method

Compares two IP addresses. Equals Returns a hash value for an IPAddress object.

GetHashCode

Returns the type of the IP address instance. GetType Converts an IP address from host byte order to network byte HostToNetworkOrder order. Indicates whether the IP address is considered the loopback address.

IsLoopBack

Converts an IP address from network byte order to host byte NetworkToHostOrder order. Converts a string to an IPAddress instance. Parse

ToString

Converts an IPAddress to a string representation of the dotted decimal format of the IP address.

IPEndPoint: object is used when binding sockets to local addresses, or when connecting sockets to remote addresses. The following two constructors are used to create IPEndPoint instances: • • IPEndPoint (long address , int port ) IPEndPoint(IPAddress address , int port ) PEndPoint Methods: Description

Method

Creates an EndPoint object from a SocketAddress object Create Returns the type of the IPEndPoint instance

GetType

Compares two IPEndPoint objects Equals Creates a SocketAddress instance of the IPEndPoint instance

Serialize

Creates a string representation of the IPEndPoint instance ToString Returns a hash value for an IPEndPoint object

GetHashCode

Example: Demonstrate Socket Programming Form4.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; namespace _CSharpApplication

{ public partial class Form4 : Form { public Form4() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Introduction to IP Addresses. IPAddress _address1 = IPAddress .Parse( "192.168.1.1" ); IPAddress _address2 = IPAddress .Broadcast; IPAddress _address3 = IPAddress .Loopback; IPAddress _address4 = IPAddress .None; IPAddress _address5 = IPAddress .Any; IPHostEntry _hostName = Dns .GetHostEntry( Dns .GetHostName()); IPAddress _myMachine = _hostName.AddressList[0]; if ( IPAddress .IsLoopback(_address3)) lstAddresses.Items.Add( "Loopback address is: " + _address3.ToString()); else lstAddresses.Items.Add( "Error obtaining the LoopbackAddress" ); lstAddresses.Items.Add( "Local IP address is: " + _myMachine.ToString()); if (_myMachine == _address3) lstAddresses.Items.Add( "Loopback Address Is Same AsLocal Address.\n" ); else lstAddresses.Items.Add( "The loopback address is not the local address.\n" ); lstAddresses.Items.Add( "Given Address is: " + _address1.ToString()); lstAddresses.Items.Add( "Broadcast address: " + _address2.ToString()); lstAddresses.Items.Add( "ANY address is: " + _address5.ToString()); lstAddresses.Items.Add( "NONE address is: " + _address4.ToString()); } private void button2_Click( object sender, EventArgs e) { //Introduction To IPEndPoint IPAddress test1 = IPAddress .Parse( "192.168.1.1" ); IPEndPoint _endPoint = new IPEndPoint (test1, 8000); lstIPEndPoint.Items.Add( "IPEndPoint is ::" +_endPoint.ToString()); lstIPEndPoint.Items.Add( "AddressFamily is ::" +_endPoint.AddressFamily); lstIPEndPoint.Items.Add( "Address is :: " + _endPoint.Address);

lstIPEndPoint.Items.Add( "Port is :: " + _endPoint.Port); lstIPEndPoint.Items.Add( "Min port number is :: " + IPEndPoint.MinPort); lstIPEndPoint.Items.Add( "Max port number is :: " +IPEndPoint .MaxPort); _endPoint.Port = 80; lstIPEndPoint.Items.Add( "Changed IPEndPoint is :: " +_endPoint.ToString()); SocketAddress _socketAddress = _endPoint.Serialize(); lstIPEndPoint.Items.Add( "SocketAddress is :: " + _socketAddress.ToString()); } }} Output:

DNS [Domain Name System] To simplify the unwieldy state of computer naming, the Domain Name System (DNS) was created. It allows the master host database to be split up and distributed among multiple systems on the Internet. DNS uses a hierarchical database approach, creating levels of information that can be split and stored on various systems throughout the Internet. DNS Structure The structure of a hierarchical database is similar to an organization chart with nodes connected in a treelike manner (that's the hierarchical part). The top node is called the root . The root node does not explicitly show up in Internet host addresses, so it is often referred to as the “nameless” node. Multiple categories were created under the root level to divide the database into pieces called domains . Each domain contains DNS servers that are responsible for maintaining the database of computer names for that area of the database (that's the distributed part).

The first (or top) level of distribution is divided into domains based on country codes. Additional top-level domains for specific organizations were created to prevent the country domains from getting overcrowded.

Domain U.S. military sites .mil

Description

Commercial organizations .com .edu .gov .net .us .org .ca .de [other countries] German organizations Organizations from other countries Nonprofit organizations Canadian organizations Internet Service Providers (ISPs) Other U.S. organizations (such as local governments) Educational institutions U.S. government organizations

Using DNS The last way to determine system IP information is to utilize the C# DNS (Domain Name System) classes. DNS can be used to obtain Internet hostnames and IP Addresses. The C# System.Net namespace contains the DNS class, which comprises several methods that allow you to obtain DNS information about hosts. The GetHostName() method retrieves the hostname of the local system. The GetHostByName() method attempts to find the IP address of a hostname. DNS Configuration When your C# application is running on a customer's system, you have no guarantee that there are any DNS servers configured. You can find out what (if any) DNS servers are configured by using the .NET Registry class methods to examine the DNS Registry values. Fortunately, all Windows platforms store the DNS server information in the same place: HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters Registry Data Values for DNS Servers

Data Value

Description

DatabasePath

The location of the host's file

Domain

The name of the system's domain

NameServer

The list of DNS servers

Hostname

The name of the system's DNS host

SearchList

A list of DNS domains to append to the end of hostnames in DNS name searches

The value of most interest here is NameServer . This should contain a single string value representing all the configured DNS servers, separated by spaces. The primary DNS server will be listed first, followed by the alternate servers. Example: Demonstrate DNS and its Configuration in Registry using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using Microsoft.Win32; namespace _CSharpApplication { public partial class Form6 : Form { public Form6() { InitializeComponent();

} private void button1_Click( object sender, EventArgs e) { //Demonstrate DNS.. string _hostName = Dns .GetHostName(); lstDNS.Items.Add( "Local hostname :: " + _hostName); IPHostEntry _ipHostEntry = Dns .GetHostByName(_hostName); foreach ( IPAddress _address in _ipHostEntry.AddressList) { lstDNS.Items.Add( "IP Address ::" + _address.ToString()); } } private void button2_Click( object sender, EventArgs e) { //DNS Configuration in Registry RegistryKey start = Registry .LocalMachine; string DNSservers = @"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" ; RegistryKey DNSserverKey = start.OpenSubKey(DNSservers); if (DNSserverKey == null ) { lstDNSConfiguration.Items.Add( "Unable to open DNS servers key" ); return ; } string serverlist = ( string )DNSserverKey.GetValue( "NameServer" ); lstDNSConfiguration.Items.Add( "DNS Servers: " + serverlist); DNSserverKey.Close(); start.Close(); char [] token = new char [1]; token[0] = ' ' ; string [] servers = serverlist.Split(token); foreach ( string server in servers) { lstDNSConfiguration.Items.Add( "DNS server: " + server); } } } } Output:

Click on both the buttons will display the respective outputs in the list box specified below Working with Files File access in .NET is generally handled with stream objects. In this section, we will discuss about the two classes BinaryWriter and BinaryReader to demonstrate the file handling in C#. The BinaryReader and BinaryWriter classes support binary file access. These classes permit binary operations to and from streams. BinaryWriter The BinaryWriter class allows primitive data types to be written to streams; and with the use of subclassing, you can override the methods of this class and fulfill your own unique character encoding requirements. The following table will summarize the properties of the class:-

Name

Type

Purpose

BaseStream

Property Allow access to binary writer underlying stream.

Close

Method

Close the Binary writer class and the underlying stream.

Flush

Method

Flushes out all data to the underlying stream and then

clears buffers.

Seek

Method

Sets the current position within the current stream.

Write

Method

This overloaded method writes a value out to the current stream.

BinaryReader The BinaryReader class, much like the BinaryWriter class, relies on a FileStream object to read files . Method Description

Close

Close the binary reader object and the base stream.

PeekChar

Reads the next available byte from the stream but does not advance the byte or character position within the file.

ReadBoolean

Reads a Boolean [True/False] value from the stream.

ReadByte

Reads a single byte from the stream. There is also a readbytes method for specifying the number of bytes to read.

ReadChar

Reads a single char value from the stream. There is also a readchars method for specifying the number of chars to read.

ReadInt16

Reads an integer value (2 bytes).

ReadInt32

Reads a long value (4 bytes).

ReadInt64

Reads an eight-byte signed integer.

Example: Demonstrate working with files using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace _CSharpApplication { public partial class Form4 : Form { public Form4() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Writing to the file FileStream myFStream = new FileStream ( "G:\\2CSharpApplication\\Test.txt" , FileMode .OpenOrCreate, FileAccess .ReadWrite); BinaryWriter binWrit = new BinaryWriter (myFStream); string testString = "Writing into a File..This is a test Value." ; binWrit.Write(testString); binWrit.Close(); myFStream.Close(); } private void button2_Click( object sender, EventArgs e) { //Reading from the file. long imageWidth = 0; long imageHeight = 0; int imagePlanes = 0; int imageBitCount = 0; string [] cma = Environment .GetCommandLineArgs();

if (cma.GetUpperBound(0) >= 1) { FileStream myFStream = new FileStream (cma[1], FileMode .Open, FileAccess .Read); BinaryReader binRead = new BinaryReader (myFStream); binRead.BaseStream.Position=0x12; imageWidth = binRead.ReadInt32(); imageHeight= binRead.ReadInt32(); imagesPlanes= binRead.ReadInt16(); imagesBitCount = binRead.ReadInt16(); Console .WriteLine( "[{0}] {1}x{2} {3}- bit" ,cma[1], imageWidth, imageHeight, imageBitCount); binRead.Close(); myFStream.Close(); } } private void button3_Click( object sender, EventArgs e) { //Copying File. string [] strcla = Environment .GetCommandLineArgs(); if (strcla.GetUpperBound(0) == 2) { FileInfo cpyfi = new FileInfo (strcla[1]); cpyfi.CopyTo(strcla[2], true ); MessageBox .Show( "Copied " + cpyfi.Length + " bytes." ); } else MessageBox .Show( "Usage: cp <input file> <output file>" ); } private void button4_Click( object sender, EventArgs e) { //Deleting File. string [] strcla = Environment .GetCommandLineArgs(); if (strcla.GetUpperBound(0) == 1) { FileInfo delfi = new FileInfo (strcla[1]); delfi.Delete(); MessageBox .Show( "File : " + strcla[1]); MessageBox .Show( "Attributes: " + delfi.Attributes.ToString()); MessageBox .Show( "File Deleted..." );

} else MessageBox .Show( "Usage: rm <filename>" ); } private void button5_Click( object sender, EventArgs e) { //Moving File. string [] strcla = Environment .GetCommandLineArgs(); if (strcla.GetUpperBound(0) == 2) { FileInfo movfi = new FileInfo (strcla[1]); movfi.MoveTo(strcla[2]); MessageBox .Show( "File Created : " +movfi.CreationTime.ToString()); MessageBox .Show( "Moved to : " + strcla[2]); } else MessageBox .Show( "Usage: mv <source file> <destination file>" ); } } } Generating Help File in C sharp An interesting feature of the C# compiler is to generate XML documentation from the comments. C# compiler reads specially formatted comments and generates XML documentation from the comments. You can then displays this XML on the Web to provide an extra level of documentation to developers who need to understand the structure of your applications. Pre-requisites to generate XML documentation from the comments are:

• •

Use three slashes for comments(///). The C# compiler does not generate any XML Documentation for any comments that do not begin with three slashes. Nor does the C# compiler generates any XML documentation for regular, multi line, comments. Use the /doc option of the C# compiler to specify the name of the file that should contain the generated XML documentation. Example: Demonstrate XML documentation from Comments Step1: In the first step we create the C# code file. using System; using System.Collections.Generic; using System.Windows.Forms; namespace _CSharpApplication

{ static class Program { /// <summary> /// The main entry point for the application. /// Developed By : C# Team /// Developed On : 21 Oct,07 /// </summary> [ STAThread ] static void Main () { Application .EnableVisualStyles(); Application .SetCompatibleTextRenderingDefault( false ); System.Console.WriteLine( "StartUp for C# World!" ); } } } Step2: The following command is used to generate the help file. The command will create two files i.e. “Program.exe” and other is “ProgramHelpFile.xml” . Command: csc /doc: HelpFile.xml ProgramFile.cs Output:The following xml will be generated by the above command. ProgramHelpFile.xml <?xml version="1.0"?> <doc> <assembly> <name>Program</name> </assembly> <members> <member name="M:_CSharpApplication.Program.Main"> <summary> The main entry point for the application. Developed By : C# Team Developed On : 21 Oct,07 </summary> </member> </members>

</doc> Note: -Main portion of XML documentation is found in <member> element: This element contains one <member> tag for each documented item in the source code. The <member> tag contains one attribute, name, which names the member being documented. The value of the name attribute starts with a one-letter prefix describing the type of information being described. Options for the first letter of the name attribute's value and its meaning. <member> “name” = Attribute Prefixes > Other Important Tags: The following is the list of more help file tags which can be used in the C#.

1. <c>:- T ag to indicate that a small part of your comment should be treated
as code. Style sheets may use this element to display the code portion of your comment E.g. /// This is the <c> Main ()</c> function for the /// Program class. <code>:- Tag to indicate that multiple lines of text in your comments should be treated as code: E.g. /// <code> /// Argument[0]: command line argument 1 /// Argument[1]: command line argument 2 /// Argument[2]: command line argument 3 /// </code> <exception>:- You can use the <exception> tag to document any exceptions that may be raised from the member's code. The <exception> tag must contain an attribute called cref whose value specifies the type of exception being documented. The cref attribute value must be enclosed in quotes. The text of the element describes the conditions under which the exception is thrown: E.g. /// <exception cref="System.Exception"> /// Raised if the input is less than 0. /// </exception> <permission>:- Use the <permission> tag to document the permissions available on a given function or variable. Access to a class's code and data can mean access to all of the code or it can be restricted to a certain subset of code. You can use the <permission> tag to document the availability of your code and data. The <permission> tag makes use of one attribute: cref. The value of the cref element must name the function or variable whose permissions are being documented: E.g. /// <permission name="Main()"> /// Everyone can access Main (). /// </permission> <remarks>:- Use the <remarks> tag to add information about an item. The <remarks> element is great for providing an overview of a method or variable and its usage. The <remarks> tag carries no attributes and its text contains the remarks: E.g. /// <remarks> /// The Main () function is the entry point into the /// application. The CLR will call Main () to start /// the application after the application loads /// </remarks>

2.

3.

4.

5.

Code Access Security

Code access security is a feature of .NET that manages code, dependent on our level of trust. If the CLR trusts the code enough to allow it to run, it will begin executing the code. Depending on the permissions provided to the assembly, however, it might run within a restricted environment. If the code is not trusted enough to run, or if it runs but then attempts to perform an action, for which it does not have the relevant permissions, a SecurityException is thrown. The code access security system means that we can stop malicious code running, but we can also allow code to run within a protected environment where we are confident that it cannot do any damage. CAS is part of .Net security model that determines whether or not a piece of code is allowed to run and what resources it can use while running. CAS grants rights to program depending on the security configuration of the machine. For e.g. the program has rights to edit or create a new file but the security configuration of machine does not allow the program to delete a file. Code access security is based on two concepts Code Groups and Permissions. The following sections will discuss both in detail. Code Group Code Group is the concept of bringing together the code with similar characteristics. Two examples for code groups are Internet and Intranet. The group Internet defines code that is sourced from the Internet, the group Intranet defines code sourced from the LAN. Code groups have an entry requirement called membership condition . Each code group has one, and only one, membership condition. Following is the available list of code group memberships: • • • • • • • • • • Zone: The region from which the code originated. A zone is one of the commonly used condition. A zone is the region of origin of a piece of code and refers to one of the following: My Computer, Internet, Intranet, Trusted, or not trusted. Site: The Web site from which the code originated. Strong Name: A unique, verifiable name for the code. Publisher: The publisher of the code. URL: The specific location from which the code originated. Hash Value: The hash value for the assembly. Skip Verification: This condition requests that it bypasses code verification checks. Application Directory: The location of the assembly within the application. All Code: All code fulfills this condition. Custom: A user-specified condition. Code groups are arranged hierarchically with the All Code membership condition at the root. Permissions Permissions are the actions we allow each code group to perform? For example, permissions include “able to access the user interface” and “able to access local storage.” The system administrator usually manages the permissions at the enterprise, machine, and user levels. Multi-Threading A thread is a sequence of execution in a program. All our C# programs up to this point have one entry point—the Main () method. Execution starts with the first statement in the Main () method and continues until that method returns. A thread is the basic unit to which the operating system allocates processor time.

Processes are made up of one or more threads. A thread is defined as a single flow of operation within a program. When a program executes on the CPU, it traverses the program statements in a single thread until the thread is complete. Amultithreaded application distributes functions among multiple program flows, allowing two or more paths of execution to occur. Each path of execution is a separate thread. Multi-tasking: It's a feature of modern operating systems with which we can run multiple programs at same time example word, excel etc Multi-Threading: Multi-threading forms subset of multi-tasking instead of having to switch between programs this feature switches between different parts of the same program. Example we are writing a word document and at the same time word is doing a spell check in background. Multithreaded programs create their own threads that can be executed separately from the main thread of the program. All threads created by the primary thread share the same memory address space as the primary thread. Often the secondary threads are used to perform computationally intensive functions, allowing the main thread to continue responding to Windows events. Without the secondary threads, the user could not select anything from the menu or click any buttons while an application computed a mathematical function System.Threading: This namespace has all the classes that are related to implement threading. Any .Net application who wants to implements threading has to import this namespace. Note: In .Net program, there are always at least two threads running, i.e. one is the main program and other is the garbage collector. States: Threads have several operational states, which are enumerated using the .NET Thread State enumeration, found in the System.Threading namespace. • • • • • • • • Initialized: The thread has been initialized but not started. Ready: The thread is waiting for a processor. Running: The thread is currently using the processor. Standby: The thread is about to use the processor. Terminated: The thread is finished and is ready to exit. Transition: The thread is waiting for a resource other than the processor. Unknown: The system is unable to determine the thread state. Wait: The thread is not ready to use the processor The Thread Class Use the Thread class to create a new Thread object, which produces a new thread within the current process. The format of the Thread constructor is as follows, where start is a ThreadStart delegate: Thread (ThreadStart start) The ThreadStart delegate points to the method that will be performed within the new thread. E.g. Thread newthread= new Thread (new ThreadStart (anyMethod)); Void anyMethod () {}

After the Thread object is created, it can be controlled using various Thread class methods, which are as under: • • • • • • • • • • Abort (): Terminate the thread. Equals (): Determines whether two thread objects are same. GetHashCode (): Get a unique representation for the thread. GetType (): Get the type of the current thread. Interrupt (): Interrupts a thread that is in a wait state. Join (): Blocks the calling thread until the thread terminates. Resume (): Resumes a thread that has been suspended. Start (): Change the state of the thread to running. Suspend (): Suspend the execution of the thread. ToString (): gets a string representation of the Thread object. Thread priority: The thread priority determines the order in which thread has to execute. The thread priority can be changed by using Threadname.Priority = ThreadPriority.Highest. Different levels of priority provided by .Net: • • • • • ThreadPriority.Highest ThreadPriority.AboveNormal ThreadPriority.Normal ThreadPriority.BelowNormal ThreadPriority.Lowest Thread.Sleep (): Thread execution can be paused by calling the Thread.Sleep method. This method takes an integer value that determines how long the thread should sleep. Example: Demonstrate Threading using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Threading; namespace ConsoleApplication1 { class Program1 { static void Main ( string [] args) { Program1 ts = new Program1 (); } public Program1() {

int i; Thread firstThread = new Thread ( new ThreadStart (FirstMethod)); Thread secondThread = new Thread ( new ThreadStart (SecondMethod)); firstThread.Start(); secondThread.Start(); for (i = 0; i < 10; i++) { Console.WriteLine( "Main: {0}" , i); Thread .Sleep(1000); } } void FirstMethod() { int i; for (i = 0; i < 10; i++) { Console.WriteLine( " First thread: {0}" , i); Thread .Sleep(2000); } } void SecondMethod() { int i; for (i = 0; i < 10; i++) { Console.WriteLine( " Second thread2: {0}" , i); Thread .Sleep(3000); } } } } Output: Main : 0 First thread: 0 Second thread2: 0 Main : 1 First thread: 1 Main : 2 Second thread2: 1 Main : 3 First thread: 2 Main : 4 Main : 5 Second thread2: 2 First thread: 3 Main : 6 Main : 7 First thread: 4 Main : 8 Second thread2: 3 Main : 9 First thread: 5 Second thread2: 4 First thread: 6 First thread: 7 Second thread2: 5 First thread: 8 Second thread2: 6 First thread: 9 Second thread2: 7 Second thread2: 8 Second thread2: 9 Globalization and Localization –1

When writing applications for international distribution, different cultures and regions must be kept in mind. Different cultures have diverging calendars and use different number and date formats, and also the sort order with the letters A-Z may lead to various results. To make applications fit for global markets you have to globalize and localize them. • • Globalization is about internationalizing applications: preparing applications for international markets. With globalization, the application supports number and date formats depending on the culture, different calendars, and so on. Localization is about translating applications for specific cultures. For translations of strings, you can use resources. .NET supports globalization and localization of Windows and Web applications. To globalize an application you can use classes from the namespace System.GlobalizationSystem.Resources. whereas to localize an application you can use resources that are supported by the namespace System.Globalization The System.Globalization namespace holds all culture and region classes to support different date formats, different number formats, and even different calendars that are represented in classes such as Gregorian calendar, Hebrew Calendar, Japanese Calendar, and so on. Using these classes you can display different representations depending on the user's locale. Cultures and Regions The world is divided into multiple cultures and regions, and applications have to be aware of these cultural and regional differences. RFC 1766 defines culture names that are used worldwide depending on a language and a country or region. Some examples are en-AU, en-CA, en-GB, and en-US for the English language in Australia , Canada , United Kingdom , and the United States . Note:- Most Important class in System.Globaliation namespace isCultureInfo [Represents a Culture] Example: Demonstrate CultureInfo using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Threading; using System.Globalization; namespace ConsoleApplication1 { class Program1 { static void Main ( string [] args) { int val = 1234567890;

string name = "visualbuilder" ; //Culture of the Current Thread Console .WriteLine(val.ToString( "N" )); //use IFormatProvider Console .WriteLine(val.ToString( "N" , new CultureInfo ( "fr- FR" ))); //Change the culture of the thread Thread .CurrentThread.CurrentCulture = new CultureInfo ( "de- DE" ); Console .WriteLine(val.ToString( "N" )); } } } Output: The following output will be displayed on console. Display in Current Culture: 1,234,567,890.00 Display in French Culture: 1 234 567 890, 00 Display in DE Culture: 1.234.567.890, 00 Working with Registry in C sharp Windows Registry is a central database for application configuration settings and other information required by the applications. The Windows Registry is a data repository that exists on each computer in Windows Operating systems. Both the system and application programs use this repository to store information needed at runtime. For example, the system stores file associations (the applications or command lines associated with each known file extension) in the Registry. Applications often use the Registry to store information such as users' option settings and data file pathnames. Note:- If you've never open Windows registry, you can see it by running regedit from command line .NET Framework Library provides two classes - Registry and RegistryKey to work with the windows registry. These classes are defined in Microsoft.Win32 namespace. So before using these classes, you need to add reference to this namespace. Registry Class: The Registry class contains members to provides access to registry keys. We can define registry keys in the following order. • • • • • • CurrentUser - Stores information about user preferences. LocalMachine - Stores configuration information for the local machine. ClassesRoot - Stores information about types (and classes) and their properties. Users - Stores information about the default user configuration. PerformanceData - Stores performance information for software components. CurrentConfig - Stores non-user-specific hardware information.

DynData - Stores dynamic data. The Registry class members are described in the following table. Returns a RegistryKey type which provides access to HKEY_CLASSES_ROOT key.

ClassesRoot

LocalMachine

Returns a RegistryKey type which provides access to HKEY_LOCAL_MACHINE key.

CurrentConfig

Returns a RegistryKey type which provides access to HKEY_CURRENT_CONFIG key.

DynData

Returns a RegistryKey type which provides access to HKEY_DYN_DATA key.

CurrentUser

Returns a RegistryKey type which provides access to HKEY_CURRENT_USER key

PerformanceData Returns a RegistryKey type which provides access to HKEY_PERFORMANCE_DATA key.

Users

Returns a RegistryKey type which provides access to HKEY_USERS key.

RegistryKey Class : The RegistryKey class contains members to add, remove, replace, and read registry data. Some of its common methods and properties are defined in the following table. Properties: Name - Represents the name of the key. SubKeyCount - Represents the count of subkeys at the base level, for theCurrent key. ValueCount - Represents the count of values in the key. Methods:

GetValueNames

Retrieves an array of strings that contains all the value names associated with this key.

GetValue

Returns the specified value.

OpenSubKey

Opens a subkey.

GetSubKeyNames Returns an array of strings that contains all the subkey names.

DeleteSubKeyTree Deletes a subkey and any children.

DeleteSubKey

Deletes the specified subkey.

CreateSubKey

Creates a new subkey if not exists, otherwise opens an existing subkey.

SetValue

Sets the specified value.

DeleteValue

Deletes the specified value from a key.

Close

Closes the key.

Example:- Working with Windows Registry. Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;

using System.Text; using System.Windows.Forms; using Microsoft.Win32; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Adding a Key and Value in Registry RegistryKey key = Registry .LocalMachine.OpenSubKey( "Software" , true ); //Create Key inside the software folder RegistryKey newkey = key.CreateSubKey( "NewTestKeyAdded" ); //User Can also set the value for this Key newkey.SetValue( "NewTestKeyAdded" , "ValueForThisTestKey" ); MessageBox.Show( "Key/Value is added in the Registry..." ); } private void button2_Click( object sender, EventArgs e) { //Retrieving Data From Registry RegistryKey pRegKey = Registry .LocalMachine; pRegKey = pRegKey.OpenSubKey( "HARDWARE\\ DESCRIPTION\\System\\FloatingPointProcessor\\0" ); Object valueOfKey = pRegKey.GetValue( "Identifier" ); MessageBox.Show( "Key Value is :: " + valueOfKey); } private void button3_Click( object sender, EventArgs e) { //Deleting Key/Value from Registry RegistryKey delKeyValue = Registry .LocalMachine.OpenSubKey( "Software\\" ); delKeyValue.DeleteValue( "ValueForThisTestKey" ); // Delete the key from the registry. true ); RegistryKey delSubKey = Registry .LocalMachine.OpenSubKey( "Software" ,

delSubKey.DeleteSubKey( "NewTestKeyAdded" ); MessageBox.Show( "Deleting Key/Value in the Registry" );

} } } Output: Adding a Key/Value in the Registry Retrieving Value from the Registry Globalization and Localization –2 The coming section will discuss about some more classes used for Globalization in C#. Resources and ResourceWriter Resources such as pictures or string tables can be put into resource files or satellite assemblies. Such resources can be very helpful when localizing applications, and .NET has built-in support to search for localized resources. A resource file can be a text file or a .resx file or XML file. This file contains the key/value pairs. Where the keys are used in the program and at run time they are replaced with the values that is corresponding to each key. For example:Name = Jim Tire Address = USA Author = Puppet Publisher = Jim Toe Note:-ResGen.exe utility is used to create a resource file out of this “test.txt” file. the command Resgen test.txt will create the text.txt resource file and Resgen test.txt test.resx will createtthe XML file from the test.txt file. ResourceWriter This class under the System.Resources namespace is used to create the resource file through the programming. The below example will create the object of theResourceWriterAddResource() method. and then we can use the same object to add upto 2GB of resources. We have to just supply the key/value pair to the object's Example: Demonstrate ResourceWriter using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Threading; using System.Globalization; using System.Resources; namespace ConsoleApplication1 { class Program1

{ static void Main ( string [] args) { ResourceWriter rw = new ResourceWriter ( "RWDemo.resources" ); rw.AddResource( "Name " , "VisualBuilder" ); rw.AddResource( "Adress" , " UK " ); rw.AddResource( "Hobby" , "Cricket" ); rw.AddResource( "Favourite Country" , " Australia " ); rw.AddResource( "Player" , "Sunny" ); rw.Close(); } } } Output: This will create RWDemo.resources file, which contains the key/value pairs. The Close() method of the ResourceWriter class automatically calls ResourceWriter.Generate() to finally write the resources to the file RWDemo.resources. Using Resource File in an Application We can add resource files to assemblies using the assembly generation tool al.exe, using the /embed option or using the c# compiler with /resource option or directly using the VS.Net. The following are the steps to use the resource files in C# application. 1. 2. 3. 4. 5. 6. 7. 8. Open the application Use the context menu of the solution explorer (Add >> Add Existing Item) Locate the path where the resource file is situated. If you check the Resource after adding it to the projects, its BuildAction is “Embedded Resource”, this means the resource is embedded to the output assembly. You can view the resource file using the ILDasm.exe utility by checking it in the assembly manifest. To access the embedded resources, use the Resource Manager class from the System.Resources namespace. You can pass the assembly that has the resources as an argument to the constructor of the Resource Manager class Once you include the resource file in the application use the Resource Manager and load the resource file into this.

Example: Demonstrate Usage of Resource File using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Resources; namespace cSHARPEXAMPLES { public partial class Form22 : Form { public Form22() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Using Resource File System.Resources. ResourceManager rm; Assembly assembly = Assembly .GetExecutingAssembly(); rm = new ResourceManager ( "cSHARPEXAMPLES.RWDemo" , assembly); txtName.Text = rm.GetString( "Name " ); txtAddress.Text=rm.GetString( "Adress" ); txtHobby.Text = rm.GetString( "Hobby" ); txtFCountry.Text = rm.GetString( "Favourite Country" ); txtPlayer.Text = rm.GetString( "Player" ); } } } Windows Service The core function of a Windows Service is to run an application in the background. One of the ways that it differs from an windows application in that a Windows Service starts before any user logs in to the system (if it has been setup to start at boot up), although it can also be setup in such a way that it requires user to start it manually. A Windows Service also has its own process hence it runs very efficiently. Normally a Windows Service will not have a user interface for a simple reason it can be run even if no one is logged on to the system but this is not a rule, you can still have a Windows Service with a user interface. Creating a Windows Service: Step 1:- Open VS 2005, Click on File > Projects.

Step 2:- This will open up a project and clicking on the hyperlink that is there on the page, you will be able to open the code behind page where you can code for the web service. Step 3:- Add Functionality to the web service that you have created. There are two overridden function i.e. “OnStart” and “OnStop”. The OnStart function executes when you start your service and the OnStop function gets execute when you stop a service. //OnStart protected override void OnStart( string [] args) {} //OnStop protected override void OnStop() {} Step 4:- Install and Run the Service: For Installation of the service on the computer, one need to have the administrator rights to install the service on the computer. The installUtil tool is provided by with the .Net framework to install the application. Note:- The use should have administrator rights to install the utility. If the utility is not installed then it will display a popup when you run the program. Example: Demonstrate Windows Services. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using System.IO; namespace winServiceFirst { public partial class OTestService : ServiceBase { public OTestService() { InitializeComponent(); } protected override void OnStart( string [] args) { //This will be printed at the start of the service....

FileStream fs = new FileStream ( @"C:\windowServiceTest\trackerForWebService.txt" , .OpenOrCreate, FileAccess .Write); m_streamWriter.BaseStream.Seek(0, SeekOrigin .End);

FileMode

StreamWriter m_streamWriter = new StreamWriter (fs); m_streamWriter.WriteLine( " ************************** \n" ); m_streamWriter.WriteLine( " mcWindowsService: Service Started \n" ); m_streamWriter.WriteLine( " ************************** \n" ); m_streamWriter.Flush(); m_streamWriter.Close(); } protected override void OnStop() { // TODO: Add code here to perform any tear-down necessary to stop your service. //This will be printed at the end of the service... FileStream fs = new FileStream ( @"C:\windowServiceTest\trackerForWebService.txt" , FileMode .OpenOrCreate, FileAccess .Write); StreamWriter m_streamWriter = new StreamWriter (fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin .End); m_streamWriter.WriteLine( " *************************** \n" ); m_streamWriter.WriteLine( " mcWindowsService: Service Stopped \n" ); m_streamWriter.WriteLine( " *************************** \n" ); m_streamWriter.Flush(); m_streamWriter.Close(); } } } Output: Note:- Thr program will write the content in the text file that we specified. The following lines gets printed in the text file.

************************** mcWindowsService: Service Started

************************** *************************** mcWindowsService: Service Stopped *************************** Web Service The term "web service" refers to a form of a component that can be used remotely. Web services are invoked remotely using SOAP or HTTP-GET and HTTP-POST protocols. Web services are based on XML and return an "answer" to the client in XML format. Web services have all the advantages of components plus many more. The most significant benefits include:

1. Platform and Language Independence : Web services can be built and 2.
consumed on any operating system just as long as that operating system supports the SOAP protocol and XML. Automatic Upgrade : Unlike components, if a web service requires an update, that update is propagated to all applications consuming that web service immediately. This is because the actual methods and properties for the web service are invoked from the web server remotely, meaning that each function contained within a web service appears as a "black box" to a client: they aren't concerned with the way the function does its job, just as long as it returns the expected result.

Some Important Terms in Web Services:

1. UDDI : UDDI (Universal Description, Discovery and Integration) is a registry

2.

3. 4.

that provides a place for a company to register its business and the services that it offers. People or businesses that need a service can use this registry to find a business that provides the service. When you search for a web service using UDDI's web service or web browser, UDDI returns a listing of web services that matched your criteria. This list is returned in the form of a DISCO or WSDL document. WSDL: WSDL (Web Services Description Language) is a language that describes a web service. It contains information such as where you can find the web service, methods and properties that it supports, its data types, and the protocol used to communicate with the web service. WSDL is based on the XML format and it's used to create proxy objects. Basically, without a WSDL document, developers wouldn't be able to use web services simply because they wouldn't know which methods and properties they support and also which communication method any particular web service supports. DISCO : DISCO (Abbreviated from disco very) is a list of WSDL documents. DISCO is used to group common web services together. DISCO documents are also in XML format. SOAP: SOAP (Simple Object Access Protocol) is a protocol to transport data to and from the web server. It is in XML format and allows you to transport a

variety of data types used in .NET. As an alternative to SOAP, we can use HTTP-GET and HTTP-POST, which will be covered later in the article. These protocols return the output in a non-SOAP format; however this output is still in XML format. Example: Demonstrate Web Service using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; [ WebService (Namespace = "http://tempuri.org/" , Description = "New WEB Service Developed by V.D" )] [ WebServiceBinding (ConformsTo = WsiProfiles .BasicProfile1_1)] public class Service : System.Web.Services. WebService { public Service () { //Uncomment the following line if using designed components //InitializeComponent(); } [ WebMethod (Description= "GetEmployeeName: This will return the Employee Name." )] public string getEmployeeName() { return "James Tube" ; } [ WebMethod (Description = "GetEmployeeAge: This will return the Employee Age." )] public string getEmployeeAge() { return "23" ; } } Output: Run this Web Service or F5 Note: 1]. There are 2 methods that are associated with this web service. 2]. The web service us under the default namespace that is http://tempuri.org. . 3]. Each XML Web service needs a unique namespace in order for client applications to distinguish it from other services on the Web.http://tempuri.org/ is available for XML Web services that are under development, but published XML Web services should use a more permanent namespace .

Output: If user clicks on the getEmployeeAge link Click on the Invoke Button will display the value. Consuming Web Services A Web Service is an external interface provided by a Web site that can be called from other Web sites. For example, a financial company may make up to the minute stock quotes available via Web Service for those who do their trading with that company. This information could be read from a Web page and displayed, or read from a stand-alone application on a customer's desktop computer. Client Communicate through web service: SOAP over HTTP SOAP over HTTP XML XML Location 1 Location 2

Soap calls are remote function calls that invoke methods executions on Web Service components at Location 2. The output is render as XML and pass back to the Location 1 where the user wants to access the Web Service. At Location 1, the user need to consume some of the functions of the web service that is available on the internet, to make the remote function calls (RFC). All the processing can't be done on the remote machine, therefore, we have to create the proxy of the web service from where we can process our data. This whole process is also called as marshalling of data. Due to security threats, we create the proxy of the server object here it is web service. That means we are creating a " proxy object " to act on behalf of the original Web service. The proxy object will have all the public available data interfaces as the original Web service. Consuming a Web Service The following are the steps to call/consume a webservice. Step 1: Create a Web Service project and run it so that no compilation error exists. Step 2: Create new Web Site that will consume this web site that is there in your system using the VS.Net. Create New Web Site with the name: Web Site Name that will consume web service:WebService_Consume. Step 3: Once you are done with the creation of the new site that will consume the web Service. Let example the web service run as this URL:http://localhost:1508/WebService_New/MyWebService.asmx

Step 4: Right click on the solution, Click on “Add Web Reference”. This will open up a new pop-up window where you can specify theURL name of your web service .

Here we specify the web service URL and if you look at the right panel there is Web Reference Name: localhost [This the default name that is there].

Step5: We specify “localhost_myWebService” name for the web reference. This will include 3 files under this folder. • • • MyWebService.disco MyWebService.discomap MyWebService.wsdl Step6: Look Inside the contents of the “disco” file <?xml version="1.0" encoding="utf-8" ?> <discovery xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns="http://schema s.xmlsoap.org/disco/"> <contractRefref="http://localhost:1508/WebService_New/MyWebService.asmx?wsdl "docRef="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns="htt p://schemas.xmlsoap.org/disco/scl/" /> <soapaddress="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns :q1="http://tempuri.org/" binding="q1:ServiceSoap"xmlns="http://schemas.xmlso ap.org/disco/soap/" /> <soapaddress="http://localhost:1508/WebService_New/MyWebService.asmx" xmlns :q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> </discovery> Step7: Look Inside the contents of the “discomap” file <?xml version="1.0" encoding="utf-8" ?> <DiscoveryClientResultsFilexmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Results> <DiscoveryClientResultreferenceType="System.Web.Services.Discovery.DiscoveryDo cumentReference"url="http://localhost:1508/WebService_New/MyWebService.asmx ?disco" filename="MyWebService.disco" /> <DiscoveryClientResultreferenceType="System.Web.Services.Discovery.ContractRefe rence"url="http://localhost:1508/WebService_New/MyWebService.asmx?wsdl" filena me="MyWebService.wsdl" /> </Results> </DiscoveryClientResultsFile> Example: Demonstrate the Consumption of the Web Service in the Web Site using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI. Page { protected void Page_Load( object sender, EventArgs e) { } protected void Button1_Click( object sender, EventArgs e) { //Consuming the WebServices through Add Web Reference //Fetching the Value from the Web Services localhost_myWebService. Service objServiceConsume = newlocalhost_myWebService. Service (); txtName.Text = objServiceConsume.getEmployeeName(); txtAge.Text = objServiceConsume.getEmployeeAge(); } } Output:

Click on the Fetcher button: This will fetch the value from the Web Service.

Creating Proxy Object of Web Service There are many ways to consume Web Services. 1. The first way is to use a SOAP Proxy Client Object generated by the WSDL utility, and it provides programmers with their familiar object model that they can use to call methods provided by the generated Proxy Interface. 2. The second way is to use HTTP-POST and HTTP-GET protocols. 3. The third way is to use a SOAP standard Request message that parses SOAP response messages with the help of the XMLHTTP COM object that is installed by the Microsoft XML Parser. WSDL: Web Services Description Language (WSDL) is an XML based protocol for information exchange in decentralized and distributed environments. A WSDL document defines services as collections of network endpoints, or ports. A WSDL document uses the following elements in the definition of network services: • • • • Types – a container for data type definitions using some type system (such as XSD). Message – an abstract, typed definition of the data being communicated. Operation – an abstract description of an action supported by the service. Port Type –an abstract set of operations supported by one or more endpoints.

• • •

Binding – a concrete protocol and data format specification for a particular port type. Port – a single endpoint defined as a combination of a binding and a network address. Service – a collection of related endpoints. Proxy Class: This proxy class serves as an intermediate between the ASP.NET Web page and the Web service

Consuming Web Service object: 1. The Asp.Net page instantiates an instance of the proxy class. For e.g. ProxyClassName objproxy = new ProxyClassName(); 2. Once the object is instantiated, then with the help of proxy object, this will make a call to the web service method. For e.g. objproxy.WebMethodName(any Parameter that has to send); 3. The proxy class marshals the parameter list and makes an HTTP request to the Web service sitting on Web Server 2. 4. The Web service unmarshals the incoming parameters, runs the method, and marshals the output parameters. These are sent back in an HTTP response. 5. The proxy class unmarshals the return parameters and passes back the result to the ASP.NET Web page. Creating a Proxy Class: Creating a Proxy class involves three steps: tep 1:- First create the proxy class of the web service using the WSDL tool. wsdl.exe:-Utility to generate code for xml web service clients and xml web services using ASP.NET from WSDL contract files, XSD schemas and discomap discovery documents. This tool can be used in conjunction with disco.exe. Run this from the Command Prompt: C:\Program Files\Microsoft Visual Studio 8\VC> wsdlhttp://localhost:1508/WebService_New/MyWebService.asmx Microsoft (R) Web Services Description Language Utility [Microsoft (R) .NET Framework, Version 2.0.50727.42] Copyright (C) Microsoft Corporation. All rights reserved. Writing file 'C:\Program Files\Microsoft Visual Studio 8\VC\Service.cs'. Step 2:- This will create the “Service.cs” file on the specified location. After this compile this Proxy Class to generate the compiled proxy

Class i.e. “Service.dll” Run this from the command Prompt: C:\Program Files\Microsoft Visual Studio 8\VC> csc /t:libraryService.cs Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42 for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727 Copyright (C) Microsoft Corporation 2001-2005. All rights Reserved. Step 3:-Place this compiled proxy class in the dll of the Web Site from where you want to access the Web Service. WSDL.EXE: • Wsdl.exe contains only one required parameter, a URL or path to the WSDL for the Web service. The following optional parameters can be specified: • /language: language – specifies what language the Proxy class should be created in (vb/cs/js). • /protocol: protocol – specifies the payload protocol to be used (SOAP, HttpGet, HttpPost) • /namespace: namespace – the namespace of the generated Proxy class. • /out: filename – the filename of the Proxy class. Proxy Class inclusion 1. Add the proxy class to the newly created Web Site 2. Go to Solution Explorer; right click on that solution à click on “Add Reference”. Below pop-up window appears

1. Clicking “Ok” will include the proxy class to the solution under “Bin folder”.
2. Now we can use this proxy class and the methods that are there in the web services. Note: A proxy class is a class containing all of the methods and objects exposed by the Web service. These methods handle the marshalling of the parameters into SOAP, sending the SOAP request over HTTP, receiving the response from the Web service, and unmarshalling the return value. The proxy class allows the client program to call a Web service as if the Web service was a local component. Once you create a proxy class using the .NET command-line toolwsdl.exe , a Web service client may invoke proxy class methods, which communicate with a Web service over the network by processing the SOAP messages sent to and from the Web service.

Example: Demonstrate the Creation of Proxy Class and its Usage using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI. Page { protected void Page_Load( object sender, EventArgs e) { } protected void btnCustomer_Click( object sender, EventArgs e) { //Fetching the Customer Data from the Proxy Class. try { Service objService = new Service (); txtCustomerAge.Text = objService.getEmployeeAge(); txtCustomerName.Text = objService.getEmployeeName(); } catch ( Exception ex) { Response.Write(ex.Source); } } } Output:

Click On the “Customer Data” Button:

Creating an XML document The .NET gives us flexibility to work with the XML files easily. .NET provides following five namespaces for XML manipulation.

1. System.Xml:- Contains major XML classes.This namespace contains many
classes to read and write XML documents.Some classes under this namespace are XmlReader, XmlTextReader, XmlValidatingReader, XmlNodeReader, XmlWriter, and XmlTextWriter. System.Xml.Schema:- Contains classes which work with XML schemas. XmlSchema, XmlSchemaAll, XmlSchemaXPath, and XmlSchemaType are the classes comes under this namespace.. System.Xml.Serialization:- Contains classes that are used to serialize objects into XML format documents or streams. System.Xml.XPath:- Contains XPath related classes to use XPath specifications. XPathDocument, XPathExression, XPathNavigator, and XPathNodeIterator classes comes under this namespace.. System.Xml.Xsl :- Contains classes to work with XSLT transformations.

2. 3. 4. 5.

Example: Demonstrate Creation of XML Document using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; namespace _CSharpApplication { public partial class Form10 : Form { public Form10() {

InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { XmlDocument xmldoc; XmlNode xmlnode; XmlElement xmlelem; XmlElement xmlelem2; XmlElement xmlelem3; XmlText xmltext; xmldoc= new XmlDocument (); //XML DECLARATION SECTION xmlnode=xmldoc.CreateNode( XmlNodeType .XmlDeclaration, "" , "" ); xmldoc.AppendChild(xmlnode); //STARTING NODE xmlelem=xmldoc.CreateElement( "" ,txtRoot.Text, "" ); xmltext=xmldoc.CreateTextNode(txtRootDesc.Text); xmlelem.AppendChild(xmltext); xmldoc.AppendChild(xmlelem); //ADD CHILD ELEMENT TO THIS NODE xmlelem2=xmldoc.CreateElement( "" ,txtFirstChild.Text, "" ); xmltext=xmldoc.CreateTextNode(txtFirstChildDesc.Text); xmlelem2.AppendChild(xmltext); xmldoc.ChildNodes.Item(1).AppendChild(xmlelem2); //ADD CHILD ELEMENT TO THIS NODE xmlelem3 = xmldoc.CreateElement( "" ,txtSecondChild.Text, "" ); xmltext = xmldoc.CreateTextNode(txtSecondChildDesc.Text); xmlelem3.AppendChild(xmltext); xmldoc.ChildNodes.Item(1).AppendChild(xmlelem3); //SAVE THE XML DOCUMENT IN A FILE "C:\CREATEXML.XML" try { xmldoc.Save( "c:\\CREATEXMLDocument.xml" ); } catch ( Exception ex) { Console.WriteLine(ex.Source); } MessageBox.Show( "***********XML DOCUMENT CREATED************" ); }

} } Output:

Clicking on the “Create XML Document” after filling all the fields.

Generated XML files looks like: <?xml version="1.0" ?> <RootName> <FirstChildName> FirstChildDesc </FirstChildName> <SecondChildName> SecondChildDesc </SecondChildName> </RootName> Reading XML document in C sharp 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. Example: The following example will show how the C# program will read the xml file. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; namespace _CSharpApplication { public partial class Form11 : Form { public Form11() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Read XML Document

try { // Open an XML file : Read Any XML that you have XmlTextReader reader = new XmlTextReader ( "C:\\CREATEXMLDocument.xml" ); while (reader.Read()) { // Move to first element reader.MoveToElement(); lstReadXML.Items.Add( "XmlTextReader Properties Test" ); lstReadXML.Items.Add( "===================" ); // Read Element's Properties lstReadXML.Items.Add( "Name:" + reader.Name); lstReadXML.Items.Add( "Base URI:" + reader.BaseURI); lstReadXML.Items.Add( "Local Name:" + reader.LocalName); lstReadXML.Items.Add( "Attribute Count:" + reader.AttributeCount.ToString()); lstReadXML.Items.Add( "Depth:" +reader.Depth.ToString()); lstReadXML.Items.Add( "Line Number:" + reader.LineNumber.ToString()); lstReadXML.Items.Add( "Node Type:" + reader.NodeType.ToString()); lstReadXML.Items.Add( "Attribute Count:" + reader.Value.ToString()); } } catch ( Exception ex) { MessageBox .Show ( "Exception: {0}" , ex.ToString()); } } } } Output: The following screen will be displayed when run the above program.

Clicking On the ‘ Read XML “ button the following screen will be displayed.

Using XMLWriter class to Write XML document in C sharp The XmlWriter class contains the functionality to write to XML documents. XmlWriter is an abstract base class and is a super class of XmlTextWriter and XmlNodeWriter

classes which are used to write the XML documents. This class has many WriteXXX methods to write paired, unpaired and empty XML elements. 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. Example: Demonstrate Writing to XML file using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; namespace _CSharpApplication { public partial class Form12 : Form { public Form12() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { //Writing XML DOCUMENT try { //CREATE NEW FILE XmlTextWriter xmlWRITER = new XmlTextWriter ( "C:\\writeEmployeeRecordInXML1.xml" , null ); //OPEN DOCUMENT FOR WRITING xmlWRITER.WriteStartDocument(); //WRITE COMMENTS xmlWRITER.WriteComment( "Commentss: START DATE : 21-OCT-07" ); xmlWRITER.WriteComment( "Commentss: WRITE XML DOCUMENT" ); //WRITE FIRST ELEMENT xmlWRITER.WriteStartElement( "EMPLOYEE" ); xmlWRITER.WriteStartElement( "r" , "RECORD" , "urn:record" ); //WRITE NEXT ELEMENT

xmlWRITER.WriteStartElement( "EMPLOYEE NAME" , "" ); xmlWRITER.WriteString(txtName.Text); xmlWRITER.WriteEndElement(); //WRITE ANOTHER ELEMENT xmlWRITER.WriteStartElement( "EMPLOYEE ADDRESS" , "" ); xmlWRITER.WriteString(txtAddress.Text); xmlWRITER.WriteEndElement(); //WRITE ANOTHER ELEMENT xmlWRITER.WriteStartElement( "EMPLOYEE Date Of Birth" , "" ); xmlWRITER.WriteString(txtDOB.Text); xmlWRITER.WriteEndElement(); //WRITE ANOTHER ELEMENT xmlWRITER.WriteStartElement( "EMPLOYEE Qualification" ,"" ); xmlWRITER.WriteString(txtQual.Text); xmlWRITER.WriteEndElement(); //WRITE CHARACTERS char [] ch = new char [3]; ch[0] = 'X' ; ch[1] = 'M' ; ch[2] = 'L' ; xmlWRITER.WriteStartElement( "WRITING CHARACTER IN XML DOCUMENT" ); xmlWRITER.WriteChars(ch, 0, ch.Length); xmlWRITER.WriteEndElement(); // END OF DOCUMENT xmlWRITER.WriteEndDocument(); // CLOSE WRITER xmlWRITER.Close(); MessageBox.Show( "*********DONE***********" ); } catch ( Exception ex) { MessageBox .Show(ex.Source); } } }}

Clicking on the “Writing XML Document”

This will generate a Xml file that contains the contents as given below: “writeEmployeeRecordInXML.xml” <?xml version="1.0"?> <!--Commentss: START DATE : 21-OCT-07--> <!--Commentss: WRITE XML DOCUMENT--> <EMPLOYEE> <r:RECORD xmlns:r="urn:record"> <EMPLOYEE NAME>Joseph</EMPLOYEE NAME> <EMPLOYEE ADDRESS>Terry</EMPLOYEE ADDRESS> <EMPLOYEE Date Of Birth>17-7-1981</EMPLOYEE Date Of Birth> <EMPLOYEE Qualification>MBA</EMPLOYEE Qualification> <WRITING CHARACTER IN XML DOCUMENT>XML</WRITING CHARACTER IN XML DOCUMENT> </r:RECORD> </EMPLOYEE> Assembly Information : Getting Permission set of the assembly The basics of CAS is whenever any code is being executed in managed world the .NET runtime verifies whether that code is allowed or not based on evidence and set of permissions. Two important things that are very much importance to the framework is: • • Evidence:- From where the code comes? Is the code managed or unmanaged. Permissions:- The permission set on which the code executes. Permissions and Permission Sets Permission is what a code can do with particular resource like File, Registry etc., and Permission Set is collection of permission. Policy Levels NET System comes up with 4 Policies that are Enterprise , Machine User, and AppDomain (which can be done through programmatically). Each policy has multiple code groups and multiple permission sets.They have the hierarchy given below.

Enterprise : All managed code in an enterprise setting.

Machine: All managed code on the computer. User: Code in all processes associated with the current user. Application Domain: Managed code in the host's application domain. Example:- To get the permission set of Current Assembly. Form13.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Diagnostics; using System.Reflection; using System.Security; using System.Security.Policy; using System.Security.Permissions; using System.Collections; namespace _CSharpApplication { public partial class Form13 : Form { //NAME OF THE BUILD_IN NAMED PERMISSION SET FOR FULLTRUST. const string sFullTrust = "FullTrust" ; static PermissionSet finalSet = new NamedPermissionSet ( "FinalAssemblySet" ); static PermissionSet permSet = null ; //FIND OUT WHETHER THIS ASSEMBLY IS FULLTRUST PERMISSIONS. static bool fullTrust = true ; public Form13() { InitializeComponent(); } private void Form13_Load( object sender, EventArgs e) { } //FIGURE OUT THE CODEGROUP AND THE POLICY LEVEL OF THE ASSEMBLY.

static bool isResGroups( CodeGroup _codeGroupparent, PolicyLevel _policyLevel) { NamedPermissionSet _namedPermissionSet = _policyLevel.GetNamedPermissionSet( _codeGroupparent.PermissionSetName); if (isFullTrust(_namedPermissionSet)) return true ; if (permSet == null ) permSet = ( PermissionSet )_namedPermissionSet; else permSet = permSet.Union(_namedPermissionSet); if (_codeGroupparent.Children.Count > 0) { foreach ( CodeGroup cp in _codeGroupparent.Children) { if (cp.Children.Count > 0) isResGroups(cp, _policyLevel); else { NamedPermissionSet nps2 = _policyLevel.GetNamedPermissionSet( cp.PermissionSetName); if (isFullTrust(nps2)) return true ; permSet = permSet.Union(nps2); } } } //FULL TRUST CODE NOT FOUND return false ; } //CHECK WHETHER THE PERMISSION SET IF FULLTRUST OR NOT FOR THE CURRENT ASSEMBLY. static bool isFullTrust( NamedPermissionSet _namedPermissionSet) { if (_namedPermissionSet.Name.Equals( "FullTrust" )) return true ; return false ; } //PASS THE PERMISSION SET AND LISTBOX AS ARGUMENT TO THE FUNCTION. static void getOutput( PermissionSet _permissionSet, ListBox _listBox) { IEnumerator psEnumerator = _permissionSet.GetEnumerator();

while (psEnumerator.MoveNext()) _listBox.Items.Add(psEnumerator.Current); } private void button1_Click( object sender, EventArgs e) { //Fetching the Permission Set of the Assembly lstPermission.Items.Add( "List of permissions assign to current assembly" ); IEnumerator policy = SecurityManager .PolicyHierarchy(); while (policy.MoveNext()) { PolicyLevel currentLevel = ( PolicyLevel )policy.Current; CodeGroup group =currentLevel.ResolveMatchingCodeGroups ( Assembly .GetExecutingAssembly().Evidence); fullTrust &= isResGroups(group, currentLevel); if (!fullTrust) { if (finalSet == null ) finalSet = permSet; else finalSet = finalSet.Intersect(permSet); permSet = null ; } else { lstPermission.Items.Add( "Current Level-" +currentLevel.Label + " || " + "Group--" + group.Name + " || " + "Group Policy--" + group.PermissionSetName); } } if (fullTrust) lblMode.Text = "Assembly is running in full-trust mode." ; else getOutput(finalSet, lstPermission); } } } Output:

Clicking on the “Assembly Information” button.

Creating your own Permission Set User can also create their own permission sets and code groups in the C#. The following are the steps needs to follow to create your own permission sets and code groups:Steps to create your own permission set and Code group 1. Go to Control Panel --> Administrative Tools --> Microsoft .NET Framework 2.0 Configuration à Double click on this a popup windows appear

2. Creating a new Permission Set à Expand “Runtime Security Policy”. There are 3 security policy levels i.e. Enterprise , Machine and User. We are creating the permission set for the machine security level.

3. Assign the permission to the permission set: Each permission set is a collection of much different permission to various resources on the computer. Select the permission that you need in the permission set.

4. Here I am selecting the “File IO” permission from the pool of permission set. And then change the settings for this permission. Here specify the “C:\” in the file path and assign only reading permission to this.

5. Here we assign 3 permission to the newly create permission set i.e. File IO, Security and User Interface.

Create New Code Group Create new code group and assign the permission that you create to this code group so that your assembly will work under the specified permission set. Right click on the All_Code node and this will open a pop-up window i.e. Create Code Group wizard. Specify the name for your code group.

1. Choose a condition type for the code group: The membership condition determines whether or not an assembly meets specific requirements to get the permission associated with a code group. Condition type in the specified context: Strong Name. You have to just click on the Import button à Select the assembly from the pop-up and this will extract the information that we needed.

2. Assign a Permission Set to the code group: Here through this window we can assign the permission set to this code group that we are going to create. Select the permission set that we created earlier. Though this window either we can create new permission set or reuse the existing one.

3. Go through the properties of the newly created Code Group Right click on the code group that you just created and you can view the “Code Group ” properties like the Code Group Name, its membership conditions and permission set that is associated to it.

Create an Application: That will perform read and write operations on file. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace winCreatingPSET { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click( object sender, EventArgs e) { //Writing to the Document StreamWriter _streamWriter = new StreamWriter ( "c:\\TestPermission.txt" ); _streamWriter.WriteLine( " Security is Important" ); _streamWriter.WriteLine( " Security can provide Authentication " ); _streamWriter.Close(); } private void button1_Click( object sender, EventArgs e) { //Reading from the Document

StreamReader _streamWriter = new StreamReader ( "c:\\TestPermission.txt" ); lstPSET.Items.Add(_streamWriter.ReadLine()); lstPSET.Items.Add(_streamWriter.ReadLine()); _streamWriter.Close(); } } } Output: Now run the application and try to click on the “write” button the screen, this will give you following exception.:-

Using C sharp Socket The System.Net.Sockets namespace contains the classes that provide the actual .NET interface to the low-level Winsock APIs. This section gives a brief overview of the C# Socket class. The core of the System.Net.Sockets namespace is the Socket class. It provides the C# managed code implementation of the Winsock API. The Socket class constructor is as follows: Socket(AddressFamily af , SocketType st , ProtocolType pt ) As you can see, the basic format of the Socket constructor mimics the original Unix socket() function. It uses three parameters to define the type of socket to create: • • • An AddressFamily to define the network type A SocketType to define the type of data connection A ProtocolType to define a specific network protocol Each of these parameters is represented by a separate enumeration within the System.Net_.Sockets namespace. Each enumeration contains the values that can be used. For normal IP communications on networks, the AddressFamily.InterNetwork value should always be used for the AddressFamily. With the InterNetwork AddressFamily, the SocketType parameter must match a particular ProtocolTypeparameter. You are not allowed to mix and match SocketTypesand ProtocolTypes. Socket Properties: Several properties of the Socket class can be used to retrieve information from a created Socket object Description Property

AddressFamily

Gets the address family of the Socket

Blocking

Gets or sets whether the Socket is in blocking mode

LocalEndPoint

Gets the local EndPoint object for the Socket

Connected

Gets a value that indicates if the Socket is connected to a remote device

RemoteEndPoint

Gets the remote EndPoint information for the Socket

SocketType

Gets the type of the Socket

Handle

Gets the operating system handle for the Socket

ProtocolType

Gets the protocol type of the Socket

Available

Gets the amount of data that is ready to be read

Introduction to Socket Exceptions: One feature of socket programming included in .NET Framework is neither used by Unix nor the Winsock API is socket exceptions. All of the Socket class methods use the SocketException exception. Any socket programming you do should always check for SocketException exceptions and then attempt to recover from the error, or at least warn the user of the problem. Example: Demonstrate Socket Properties and Socket Exception Handling using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;

using System.Net; using System.Net.Sockets; namespace _CSharpApplication { public partial class Form5 : Form { public Form5() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { // Demonstrate Socket Properties IPAddress _ipAddress = IPAddress .Parse( "127.0.0.1" ); IPEndPoint _ipEndPoint = new IPEndPoint (_ipAddress, 8000); Socket _socketTest = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp); lstSocketProperties.Items.Add( "AddressFamily :: " + _socketTest.AddressFamily); lstSocketProperties.Items.Add( "SocketType :: " + _socketTest.SocketType); lstSocketProperties.Items.Add( "ProtocolType :: " + _socketTest.ProtocolType); lstSocketProperties.Items.Add( "Blocking :: " +_socketTest.Blocking); _socketTest.Blocking = false ; lstSocketProperties.Items.Add( "new Blocking :: " + _socketTest.Blocking); lstSocketProperties.Items.Add( "Connected :: " + _socketTest.Connected); _socketTest.Bind(_ipEndPoint); IPEndPoint _newIpEndPoint = ( IPEndPoint )_socketTest.LocalEndPoint; lstSocketProperties.Items.Add( "Local EndPoint :: " + _newIpEndPoint.ToString()); _socketTest.Close(); } private void button2_Click( object sender, EventArgs e) { //Socket Exceptions IPAddress _hostIPAddress = IPAddress .Parse( "192.168.1.1" ); IPEndPoint _hostIPEndPoint = new IPEndPoint (_hostIPAddress, 8000); Socket _socket = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp); try {

_socket.Connect(_hostIPEndPoint); } catch ( SocketException e1) { lstSocketExceptions.Items.Add( "Problem Connecting To Host ........" ); lstSocketExceptions.Items.Add(e1.ToString()); _socket.Close(); return ; } try { _socket.Send( Encoding .ASCII.GetBytes( "testing" )); } catch ( SocketException ex) { lstSocketExceptions.Items.Add( "Problem Sending Data" ); lstSocketExceptions.Items.Add(ex.ToString()); _socket.Close(); return ; } _socket.Close(); } } } Output:

Clicking On both the Buttons will display the respective outputs in the listbox

Sign up to vote on this title
UsefulNot useful