ArtinSoft's Blogs

Software Migration Experts
Welcome to ArtinSoft's Blogs Sign in | Join | Help
in Search

Mauricio Rojas Blog

October 2006 - Posts

  • Coverage Tool for C#

    I recently checkout NCover  http://www.ncover.org/
    NCover is a code coverage analysis tool for .NET applications that gives line-by-line code coverage statistics.

    This is an open source tool. It generetes a nice graphical output about the functions used and not used. You can see data like: * how many times a function is called and * start and end line numbers of the functions * unused properties of assembly You can find the beginner level tutorial at, http://blog.dotnetwiki.org/archive/2004/07/15/594.aspx
  • VB.NET to C# Comparison

        Usually in .NET you end up writing code either in VB.NET or C# depending on your clients preferences.
       So you usually end up in a situation where you know how to do something in C# but do not remember the syntax in VB.NET or viceversa.
     Well I found the following article and I'm copying it here (I had some problems with the link so I decided to copy it).

    I want to make clear that I DID NOT WROTE THIS because I do not want to take credit for other peoples work. and it was taken from http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html

    "This is a quick reference guide to highlight some key syntactical differences between VB.NET (version 2) and C#. Hope you find this useful!
    Thank you to Tom Shelton, Fergus Cooney, Steven Swafford and others for your contributions. "






    VB.NET Program Structure C#
    Imports System

    Namespace Hello
       Class HelloWorld
          Overloads Shared Sub Main(ByVal args() As String)
             Dim name As String = "VB.NET"

             'See if an argument was passed from the command line
              If args.Length = 1 Then name = args(0)

              Console.WriteLine("Hello, " & name & "!")
          End Sub
       End Class
    End Namespace
    using System;

    namespace Hello {
       public class HelloWorld {
          public static void Main(string[] args) {
             string name = "C#";

             // See if an argument was passed from the command line
             if (args.Length == 1)
                name = args[0];

             Console.WriteLine("Hello, " + name + "!");
          }
       }
    }
    VB.NET Comments C#
    ' Single line only
    Rem Single line only

    // Single line
    /* Multiple
        line  */
    /// XML comments on single line
    /** XML comments on multiple lines */

    VB.NET Data Types C#

    Value Types
    Boolean
    Byte
    Char   (example: "A"c)
    Short, Integer, Long
    Single, Double
    Decimal
    Date

    Reference Types
    Object
    String

    Dim x As Integer
    Console.WriteLine(x.GetType())          ' Prints System.Int32
    Console.WriteLine(GetType(Integer))   ' Prints System.Int32
    Console.WriteLine(TypeName(x))        ' Prints Integer

    ' Type conversion
    Dim d As Single = 3.5
    Dim i As Integer = CType(d, Integer)   ' set to 4 (Banker's rounding)
    i = CInt(d)  ' same result as CType
    i = Int(d)    ' set to 3 (Int function truncates the decimal)

    Value Types
    bool
    byte, sbyte
    char   (example: 'A')
    short, ushort, int, uint, long, ulong
    float, double
    decimal
    DateTime   (not a built-in C# type)

    Reference Types
    object
    string

    int x;
    Console.WriteLine(x.GetType());              // Prints System.Int32
    Console.WriteLine(typeof(int));               // Prints System.Int32
    Console.WriteLine(x.GetType().Name);   // prints Int32


    // Type conversion

    float d = 3.5f;
    int i = (int)d;   // set to 3  (truncates decimal)

    VB.NET Constants C#
    Const MAX_STUDENTS As Integer = 25

    ' Can set to a const or var; may be initialized in a constructor
    ReadOnly MIN_DIAMETER As Single = 4.93

    const int MAX_STUDENTS = 25;

    // Can set to a const or var; may be initialized in a constructor
    readonly float MIN_DIAMETER = 4.93f;

    VB.NET Enumerations C#
    Enum Action
      Start 
      [Stop]   ' Stop is a reserved word
      Rewind
      Forward
    End Enum

    Enum Status
      Flunk = 50
      Pass = 70
      Excel = 90
    End Enum

    Dim a As Action = Action.Stop
    If a <> Action.Start Then _
       Console.WriteLine(a.ToString & " is " & a)     ' Prints "Stop is 1"

    Console.WriteLine(Status.Pass)     ' Prints 70
    Console.WriteLine(Status.Pass.ToString())     ' Prints Pass
    enum Action {Start, Stop, Rewind, Forward};
    enum Status {Flunk = 50, Pass = 70, Excel = 90};

    Action a = Action.Stop;
    if (a != Action.Start)
      Console.WriteLine(a + " is " + (int) a);    // Prints "Stop is 1"

    Console.WriteLine((int) Status.Pass);    // Prints 70
    Console.WriteLine(Status.Pass);      // Prints Pass
    VB.NET Operators C#

    Comparison
    =  <  >  <=  >=  <>

    Arithmetic
    +  -  *  /
    Mod
    (integer division)
    (raise to a power)

    Assignment
    =  +=  -=  *=  /=  \=  ^=  <<=  >>=  &=

    Bitwise
    And   Or   Not   <<   >>

    Logical
    AndAlso   OrElse   And   Or   Xor   Not

    Note: AndAlso and OrElse perform short-circuit logical evaluations

    String Concatenation
    &   +

    Comparison
    ==  <  >  <=  >=  !=

    Arithmetic
    +  -  *  /
    (mod)
    (integer division if both operands are ints)
    Math.Pow(x, y)

    Assignment
    =  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --

    Bitwise
    &   |   ^   ~   <<   >>

    Logical
    &&   ||   &   |   ^   !

    Note: && and || perform short-circuit logical evaluations

    String Concatenation
    +

    VB.NET Choices C#

    greeting = IIf(age < 20, "What's up?", "Hello")

    ' One line doesn't require "End If"
    If age < 20 Then greeting = "What's up?"
    If age < 20 Then greeting = "What's up?" Else greeting = "Hello"

    ' Use : to put two commands on same line
    If x <> 100 And y < 5 Then x *= 5 : y *= 2  

    ' Preferred
    If x <> 100 And y < 5 Then
      x *= 5
      y *= 2
    End If

    ' To break up any long single line use _
    If whenYouHaveAReally < longLine And _
      itNeedsToBeBrokenInto2 > Lines Then _
      UseTheUnderscore(charToBreakItUp)

    'If x > 5 Then
      x *= y
    ElseIf x = 5 Then
      x += y
    ElseIf x < 10 Then
      x -= y
    Else
      x /= y
    End If

    Select Case color   ' Must be a primitive data type
      Case "pink", "red"
        r += 1
      Case "blue"
        b += 1
      Case "green"
        g += 1
      Case Else
        other += 1
    End Select

    greeting = age < 20 ? "What's up?" : "Hello";

    if (age < 20)
      greeting = "What's up?";
    else
      greeting = "Hello";

    // Multiple statements must be enclosed in {}
    if (x != 100 && y < 5) {   
      x *= 5;
      y *= 2;
    }



    No need for _ or : since ; is used to terminate each statement.





    if
    (x > 5)
      x *= y;
    else if (x == 5)
      x += y;
    else if (x < 10)
      x -= y;
    else
      x /= y;



    // Every case must end with break or goto case
    switch (color) {                          // Must be integer or string
      case "pink":
      case "red":    r++;    break;
      case "blue":   b++;   break;
      case "green": g++;   break;
      default:    other++;   break;       // break necessary on default
    }

    VB.NET Loops C#
    Pre-test Loops:
    While c < 10
      c += 1
    End While

    Do Until c = 10 
      c += 1
    Loop

    Do While c < 10
      c += 1
    Loop

    For c = 2 To 10 Step 2
      Console.WriteLine(c)
    Next


    Post-test Loops:
    Do 
      c += 1
    Loop While c < 10
    Do 
      c += 1
    Loop Until c = 10

    '  Array or collection looping
    Dim names As String() = {"Fred", "Sue", "Barney"}
    For Each s As String In names
      Console.WriteLine(s)
    Next

    ' Breaking out of loops
    Dim i As Integer = 0
    While (True)
      If (i = 5) Then Exit While
      i += 1
    End While


    ' Continue to next iteration
    For i = 0 To 4
      If i < 4 Then Continue For
      Console.WriteLine(i)   ' Only prints 4
    Next

    Pre-test Loops:  

    // no "until" keyword
    while (c < 10)
      c++;

    for (c = 2; c <= 10; c += 2)
      Console.WriteLine(c);



    Post-test Loop:

    do
      c++;
    while (c < 10);



    // Array or collection looping
    string[] names = {"Fred", "Sue", "Barney"};
    foreach (string s in names)
      Console.WriteLine(s);

    // Breaking out of loops
    int i = 0;
    while (true) {
      if (i == 5)
        break;
      i++;
    }

    // Continue to next iteration
    for (i = 0; i < 5; i++) {
      if (i < 4)
        continue;
      Console.WriteLine(i);   // Only prints 4
    }

    VB.NET Arrays C#

    Dim nums() As Integer = {1, 2, 3} 
    For i As Integer = 0 To nums.Length - 1
      Console.WriteLine(nums(i))
    Next

    ' 4 is the index of the last element, so it holds 5 elements
    Dim names(4) As String
    names(0) = "David"
    names(5) = "Bobby"  ' Throws System.IndexOutOfRangeException

    ' Resize the array, keeping the existing values (Preserve is optional)
    ReDim Preserve names(6)



    Dim twoD(rows-1, cols-1) As Single
    twoD(2, 0) = 4.5

    Dim jagged()() As Integer = { _
      New Integer(4) {}, New Integer(1) {}, New Integer(2) {} }
    jagged(0)(4) = 5

    int[] nums = {1, 2, 3};
    for (int i = 0; i < nums.Length; i++)
      Console.WriteLine(nums[i]);


    // 5 is the size of the array
    string[] names = new string[5];
    names[0] = "David";
    names[5] = "Bobby";   // Throws System.IndexOutOfRangeException


    // C# can't dynamically resize an array.  Just copy into new array.
    string[] names2 = new string[7];
    Array.Copy(names, names2, names.Length);   // or names.CopyTo(names2, 0); 

    float[,] twoD = new float[rows, cols];
    twoD[2,0] = 4.5f; 

    int[][] jagged = new int[3][] {
      new int[5], new int[2], new int[3] };
    jagged[0][4] = 5;

    VB.NET Functions C#

    ' Pass by value (in, default), reference (in/out), and reference (out) 
    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
      x += 1
      y += 1
      z = 5
    End Sub

    Dim a = 1, b = 1, c As Integer   ' c set to zero by default 
    TestFunc(a, b, c)
    Console.WriteLine("{0} {1} {2}", a, b, c)   ' 1 2 5

    ' Accept variable number of arguments
    Function Sum(ByVal ParamArray nums As Integer()) As Integer
      Sum = 0 
      For Each i As Integer In nums
        Sum += i
      Next
    End Function   ' Or use Return statement like C#

    Dim total As Integer = Sum(4, 3, 2, 1)   ' returns 10

    ' Optional parameters must be listed last and must have a default value
    Sub SayHello(ByVal name As String, Optional ByVal prefix As String = "")
      Console.WriteLine("Greetings, " & prefix & " " & name)
    End Sub

    SayHello("Strangelove", "Dr.")
    SayHello("Madonna")

    // Pass by value (in, default), reference (in/out), and reference (out)
    void TestFunc(int x, ref int y, out int z) {
      x++;  
      y++;
      z = 5;
    }

    int a = 1, b = 1, c;  // c doesn't need initializing
    TestFunc(a, ref b, out c);
    Console.WriteLine("{0} {1} {2}", a, b, c);  // 1 2 5

    // Accept variable number of arguments
    int Sum(params int[] nums) {
      int sum = 0;
      foreach (int i in nums)
        sum += i;
      return sum;
    }

    int total = Sum(4, 3, 2, 1);   // returns 10

    /* C# doesn't support optional arguments/parameters.  Just create two different versions of the same function. */ 
    void SayHello(string name, string prefix) {
      Console.WriteLine("Greetings, " + prefix + " " + name);


    void SayHello(string name) {
      SayHello(name, "");
    }

    VB.NET Strings C#

    Special character constants
    vbCrLf, vbCr, vbLf, vbNewLine
    vbNullString
    vbTab
    vbBack
    vbFormFeed
    vbVerticalTab
    ""

    ' String concatenation (use & or +)
    Dim school As String = "Harding" & vbTab
    school = school & "University" ' school is "Harding (tab) University"

    ' Chars
    Dim letter As Char = school.Chars(0)   ' letter is H
    letter = Convert.ToChar(65)                ' letter is A
    letter = Chr(65)                                 ' same thing
    Dim word() As Char = school.ToCharArray() ' word holds Harding

    ' No string literal operator 
    Dim msg As String = "File is c:\temp\x.dat" 



    ' String comparison
    Dim mascot As String = "Bisons"
    If (mascot = "Bisons") Then   ' true
    If (mascot.Equals("Bisons")) Then   ' true
    If (mascot.ToUpper().Equals("BISONS")) Then  ' true
    If (mascot.CompareTo("Bisons") = 0) Then   ' true

    Console.WriteLine(mascot.Substring(2, 3)) ' Prints "son"

    ' String matching
    If ("John 3:16" Like "Jo[Hh]? #:*") Then   'true

    Imports System.Text.RegularExpressions   ' More powerful than Like
    Dim r As New Regex("Jo[hH]. \d:*")
    If (r.Match("John 3:16").Success) Then   'true

    ' My birthday: Oct 12, 1973
    Dim dt As New DateTime(1973, 10, 12)
    Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy")

    ' Mutable string
    Dim buffer As New System.Text.StringBuilder("two ")
    buffer.Append("three ")
    buffer.Insert(0, "one ")
    buffer.Replace("two", "TWO")
    Console.WriteLine(buffer)         ' Prints "one TWO three"

    Escape sequences
    \n, \r
    \t
    \\
    \"




    // String concatenation
    string school = "Harding\t";
    school = school + "University";   // school is "Harding (tab) University"

    // Chars
    char letter = school[0];            // letter is H
    letter = Convert.ToChar(65);     // letter is A
    letter = (char)65;                    // same thing
    char[] word = school.ToCharArray();   // word holds Harding

    // String literal
    string msg = @"File is c:\temp\x.dat";
    // same as
    string msg = "File is c:\\temp\\x.dat";

    // String comparison
    string mascot = "Bisons";
    if (mascot == "Bisons")    // true
    if (mascot.Equals("Bisons"))   // true
    if (mascot.ToUpper().Equals("BISONS"))   // true
    if (mascot.CompareTo("Bisons") == 0)    // true

    Console.WriteLine(mascot.Substring(2, 3));    // Prints "son"

    // String matching
    // No Like equivalent - use regular expressions


    using System.Text.RegularExpressions;
    Regex r = new Regex(@"Jo[hH]. \d:*");
    if (r.Match("John 3:16").Success)   // true

    // My birthday: Oct 12, 1973
    DateTime dt = new DateTime(1973, 10, 12);
    string s = "My birthday: " + dt.ToString("MMM dd, yyyy");

    // Mutable string
    System.Text.StringBuilder buffer = new System.Text.StringBuilder("two ");
    buffer.Append("three ");
    buffer.Insert(0, "one ");
    buffer.Replace("two", "TWO");
    Console.WriteLine(buffer);     // Prints "one TWO three"

    VB.NET Exception Handling C#

    ' Throw an exception
    Dim ex As New Exception("Something is really wrong.")
    Throw  ex 

    ' Catch an exception
    Try 
      y = 0
      x = 10 / y
    Catch ex As Exception When y = 0 ' Argument and When is optional
      Console.WriteLine(ex.Message)
    Finally
      Beep()
    End Try

    ' Deprecated unstructured error handling
    On Error GoTo MyErrorHandler
    ...
    MyErrorHandler: Console.WriteLine(Err.Description)

    // Throw an exception
    Exception up = new Exception("Something is really wrong.");
    throw up;  // ha ha

    // Catch an exception
    try
      y = 0;
      x = 10 / y;
    }
    catch (Exception ex) {   // Argument is optional, no "When" keyword 
      Console.WriteLine(ex.Message);
    }
    finally {
      // Requires reference to the Microsoft.VisualBasic.dll
      // assembly (pre .NET Framework v2.0)

      Microsoft.VisualBasic.Interaction.Beep();
    }

    VB.NET Namespaces C#

    Namespace Harding.Compsci.Graphics 
      ...
    End Namespace

    ' or

    Namespace Harding
      Namespace Compsci
        Namespace Graphics 
          ...
        End Namespace
      End Namespace
    End Namespace

    Imports Harding.Compsci.Graphics

    namespace Harding.Compsci.Graphics {
      ...
    }

    // or

    namespace Harding {
      namespace Compsci {
        namespace Graphics {
          ...
        }
      }
    }

    using Harding.Compsci.Graphics;

    VB.NET Classes / Interfaces C#

    Accessibility keywords
    Public
    Private
    Friend                   
    Protected
    Protected Friend
    Shared

    ' Inheritance
    Class FootballGame
      Inherits Competition
      ...
    End Class 

    ' Interface definition
    Interface IAlarmClock 
      ...
    End Interface

    // Extending an interface 
    Interface IAlarmClock
      Inherits IClock
      ...
    End Interface

    // Interface implementation
    Class WristWatch 
      Implements IAlarmClock, ITimer 
       ...
    End Class 

    Accessibility keywords
    public
    private
    internal
    protected
    protected internal
    static

    // Inheritance
    class FootballGame : Competition {
      ...
    }


    // Interface definition

    interface IAlarmClock {
      ...
    }

    // Extending an interface 
    interface IAlarmClock : IClock {
      ...
    }


    // Interface implementation

    class WristWatch : IAlarmClock, ITimer {
       ...
    }

    VB.NET Constructors / Destructors C#
    Class SuperHero
      Private _powerLevel As Integer

      Public Sub New()
        _powerLevel = 0
      End Sub

      Public Sub New(ByVal powerLevel As Integer)
        Me._powerLevel = powerLevel
      End Sub

      Protected Overrides Sub Finalize() 
       ' Desctructor code to free unmanaged resources
        MyBase.Finalize()
      End Sub
    End Class

    class SuperHero {
      private int _powerLevel;

      public SuperHero() {
         _powerLevel = 0;
      }

      public SuperHero(int powerLevel) {
        this._powerLevel= powerLevel; 
      }

      ~SuperHero() {
        // Destructor code to free unmanaged resources.
        // Implicitly creates a Finalize method

      }
    }

    VB.NET Using Objects C#

    Dim hero As SuperHero = New SuperHero
    ' or
    Dim hero As New SuperHero

    With hero
      .Name = "SpamMan"
      .PowerLevel = 3
    End With

    hero.Defend("Laura Jones")
    hero.Rest()     ' Calling Shared method
    ' or
    SuperHero.Rest()

    Dim hero2 As SuperHero = hero  ' Both reference the same object
    hero2.Name = "WormWoman"
    Console.WriteLine(hero.Name)   ' Prints WormWoman

    hero = Nothing    ' Free the object

    If hero Is Nothing Then _
      hero = New SuperHero

    Dim obj As Object = New SuperHero
    If TypeOf obj Is SuperHero Then _
      Console.WriteLine("Is a SuperHero object.")

    ' Mark object for quick disposal
    Using reader As StreamReader = File.OpenText("test.txt")
      Dim line As String = reader.ReadLine()
      While Not line Is Nothing
        Console.WriteLine(line)
        line = reader.ReadLine()
      End While
    End Using

    SuperHero hero = new SuperHero();



    // No "With" construct
    hero.Name = "SpamMan";
    hero.PowerLevel = 3;


    hero.Defend("Laura Jones");
    SuperHero.Rest();   // Calling static method



    SuperHero hero2 = hero;   // Both reference the same object
    hero2.Name = "WormWoman";
    Console.WriteLine(hero.Name);   // Prints WormWoman

    hero = null ;   // Free the object

    if (hero == null)
      hero = new SuperHero();

    Object obj = new SuperHero(); 
    if (obj is SuperHero)
      Console.WriteLine("Is a SuperHero object.");

    // Mark object for quick disposal
    using (StreamReader reader = File.OpenText("test.txt")) {
      string line;
      while ((line = reader.ReadLine()) != null)
        Console.WriteLine(line);
    }
    VB.NET Structs C#

    Structure StudentRecord
      Public name As String
      Public gpa As Single

      Public Sub New(ByVal name As String, ByVal gpa As Single)
        Me.name = name
        Me.gpa = gpa
      End Sub
    End Structure

    Dim stu As StudentRecord = New StudentRecord("Bob", 3.5)
    Dim stu2 As StudentRecord = stu  

    stu2.name = "Sue"
    Console.WriteLine(stu.name)    ' Prints Bob
    Console.WriteLine(stu2.name)  ' Prints Sue

    struct StudentRecord {
      public string name;
      public float gpa;

      public StudentRecord(string name, float gpa) {
        this.name = name;
        this.gpa = gpa;
      }
    }

    StudentRecord stu = new StudentRecord("Bob", 3.5f);
    StudentRecord stu2 = stu;  

    stu2.name = "Sue";
    Console.WriteLine(stu.name);    // Prints Bob
    Console.WriteLine(stu2.name);   // Prints Sue

    VB.NET Properties C#

    Private _size As Integer

    Public Property Size() As Integer
      Get
        Return _size
      End Get
      Set (ByVal Value As Integer)
        If Value < 0 Then
          _size = 0
        Else
          _size = Value
        End If
      End Set
    End Property

    foo.Size += 1

    private int _size;

    public int Size {
      get {
        return _size;
      }
      set {
        if (value < 0)
          _size = 0;
        else
          _size = value;
      }
    }


    foo.Size++;

    VB.NET Delegates / Events C#

    Delegate Sub MsgArrivedEventHandler(ByVal message As String)

    Event MsgArrivedEvent As MsgArrivedEventHandler

    ' or to define an event which declares a delegate implicitly
    Event MsgArrivedEvent(ByVal message As String)

    AddHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback
    ' Won't throw an exception if obj is Nothing
    RaiseEvent MsgArrivedEvent("Test message")
    RemoveHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback

    Imports System.Windows.Forms

    Dim WithEvents MyButton As Button   ' WithEvents can't be used on local variable
    MyButton = New Button

    Private Sub MyButton_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyButton.Click
      MessageBox.Show(Me, "Button was clicked", "Info", _
        MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

    delegate void MsgArrivedEventHandler(string message);

    event MsgArrivedEventHandler MsgArrivedEvent;

    // Delegates must be used with events in C#


    MsgArrivedEvent += new MsgArrivedEventHandler(My_MsgArrivedEventCallback);
    MsgArrivedEvent("Test message");    // Throws exception if obj is null
    MsgArrivedEvent -= new MsgArrivedEventHandler(My_MsgArrivedEventCallback);



    using System.Windows.Forms;

    Button MyButton = new Button(); 
    MyButton.Click += new System.EventHandler(MyButton_Click);

    private void MyButton_Click(object sender, System.EventArgs e) {
      MessageBox.Show(this, "Button was clicked", "Info",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    VB.NET Console I/O C#

    Console.Write("What's your name? ")
    Dim name As String = Console.ReadLine()
    Console.Write("How old are you? ")
    Dim age As Integer = Val(Console.ReadLine())
    Console.WriteLine("{0} is {1} years old.", name, age) 
    ' or
    Console.WriteLine(name & " is " & age & " years old.")

    Dim c As Integer
    c = Console.Read()    ' Read single char
    Console.WriteLine(c)   ' Prints 65 if user enters "A"

    Console.Write("What's your name? ");
    string name = Console.ReadLine();
    Console.Write("How old are you? ");
    int age = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("{0} is {1} years old.", name, age);
    // or
    Console.WriteLine(name + " is " + age + " years old.");


    int c = Console.Read();  // Read single char
    Console.WriteLine(c);    // Prints 65 if user enters "A"

    VB.NET File I/O C#

    Imports System.IO

    ' Write out to text file
    Dim writer As StreamWriter = File.CreateText("c:\myfile.txt")
    writer.WriteLine("Out to file.")
    writer.Close()

    ' Read all lines from text file
    Dim reader As StreamReader = File.OpenText("c:\myfile.txt")
    Dim line As String = reader.ReadLine()
    While Not line Is Nothing
      Console.WriteLine(line)
      line = reader.ReadLine()
    End While
    reader.Close()

    ' Write out to binary file
    Dim str As String = "Text data"
    Dim num As Integer = 123
    Dim binWriter As New BinaryWriter(File.OpenWrite("c:\myfile.dat")) 
    binWriter.Write(str) 
    binWriter.Write(num) 
    binWriter.Close()

    ' Read from binary file
    Dim binReader As New BinaryReader(File.OpenRead("c:\myfile.dat"))
    str = binReader.ReadString()
    num = binReader.ReadInt32()
    binReader.Close()

    using System.IO;

    // Write out to text file
    StreamWriter writer = File.CreateText("c:\\myfile.txt");
    writer.WriteLine("Out to file.");
    writer.Close();

    // Read all lines from text file
    StreamReader reader = File.OpenText("c:\\myfile.txt");
    string line = reader.ReadLine();
    while (line != null) {
      Console.WriteLine(line);
      line = reader.ReadLine();
    }
    reader.Close();

    // Write out to binary file
    string str = "Text data";
    int num = 123;
    BinaryWriter binWriter = new BinaryWriter(File.OpenWrite("c:\\myfile.dat"));
    binWriter.Write(str);
    binWriter.Write(num);
    binWriter.Close();

    // Read from binary file
    BinaryReader binReader = new BinaryReader(File.OpenRead("c:\\myfile.dat"));
    str = binReader.ReadString();
    num = binReader.ReadInt32();
    binReader.Close();

  • Win32 APIS to .NET

     Migrating C++ code from Win32 to managed code can be quite complex, specially if you have a lot of Win32 code of GUI code.
    I copying some links here that will be of help during this task

    The following link gives an introduction to managed C++:

    Introduction to Managed C++


    From that article:
    "

    Here are some specific advantages of MC++:

    • The best performance of generated IL code because of both optimizations of the generated IL and less IL generated (as discussed in the previous section). This is specifically because MC++ is the only .NET compiler with a full optimizer back end, which is pretty much the same one that is used by the unmanaged compiler.
    • MC++ is your language of choice if you want full control of the .NET environment:
      • Allows one to use all seven levels of CTS member access. C# allows only six.
      • Allows direct access to interior gc pointers, useful in a whole class of system applications such as system and .NET utilities.
      • Offers explicit control of expensive operations like boxing.
      • Supports multiple indexed properties on a type, unlike C#.
    • MC++ is currently the only managed language that allows you to mix unmanaged and managed code, even in the same file. This leads to several other points:
      • Allows a developer to keep performance-critical portions of the code in native code.
      • Gives seamless access to all unmanaged libraries, such as DLLs, statically-linked libraries, COM objects, template libraries, and more.
      • Leverages existing investments in C++ programming skills and legacy C++ code.
      • Porting unmanaged code to .NET: MC++ allows you to take existing unmanaged code and compile it to managed code (with the /clr compiler switch and IJW).
      • Gives the ability to port code at one's own rate rather than re-write all at once.
      • Provides the easiest way to add .NET support to your existing native C++ Windows applications, by allowing you to bridge the gap between the two environments with as little work on your behalf as possible, and with the lowest performance penalty.
    • MC++ is currently the only language that allows some form of multi-paradigm design and development with full support for generic programming and templates. This can lead to more options and better designs and implementations.

    Disadvantages of Managed C++

    • C++ is a more complex language than C# in both its syntax and areas where one could get into trouble. Since MC++ follows the C++ paradigm of "explicit is good", some MC++ constructs may seem really ugly. For simpler types of applications, and with certain types of developers, it may make more sense to use C#.
    • Managed C++ code is non-verifiable, since C++ can perform unsafe operations. The implication of this is that MC++ code may not run in restricted environments that will not run code that is non-verifiable.
    • Some minor features of the .NET platform are not supported yet, such as Jagged Arrays.
    • IDEsupport is currently lacking, compared to other managed languages, since there's little or no designer support (but Everett will change this).
    • "
    #using mscorlib.dll;
    // required for MC++
    void main()
    {
        System::Console::WriteLine(S"Managed C++ Rocks!!");
    }


    This other article explains how the different mixes you can make with managed and unmanaged code:
    Intro to C++ Managed Code


    And this article Microsoft Win32 to Microsoft .NET Framework API Map
    Gives a map for your APIs that can be very helpful



  • Utility to Patch XML

    Recently I was in the need to PATCH an xml. I had a program that generated an XML that was input to other program.
    My problem was that there were some particular changes I needed to do to my XML but they could need to be redone If i regenerated my XML, so how could I automate that. I could not find an easy tool to do that so I built one and here it is:
    It uses the XML facilities in .NET and it is a quick and dirty implementation. It allows you to Comment tags, to remove them or to add tags and also attributes

    Here is a sample input file


    <?xml version="1.0" encoding="utf-8" ?>

    <PatchesInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">>

     <!-- Sample Patch -->

      <Patches>

        <Patch forAttribute="false">

          <Type>Apply</Type>

          <Content>

           <![CDATA[  <ADDEDTAG/>]]>

          </Content>

          <XPathLocation>//MyData[@name='Entry1']/MyAttribytes/Attribute[@name='Att58']/Annotations</XPathLocation>

       </Patch>

       <!-- Commenting -->

        <Patch forAttribute="false">

          <Type>Comment</Type>

          <Content>

            <![CDATA[** This part with be put on top of the comment entry ** ]]>

          </Content>

          <XPathLocation>//MyData[@name='Entry1']/MyAttribytes/Attribute[@name='Att59']/Annotations</XPathLocation>

        </Patch>

     
    using System;

    using System.IO;

    using System.Collections.Generic;

    using System.Text;

    using System.Xml;

    using System.Xml.Serialization;

    using System.Diagnostics;

     

    namespace XMLPatcher

    {

        // Set this 'Customer' class as the root node

        // of any XML file its serialized to.

        [XmlRootAttribute("PatchesInfo", Namespace = "", IsNullable = false)]

        public class Patches

        {

     

            /// <summary>

            /// Default constructor for this class

            /// (required for serialization).

            /// </summary>       

            public Patches()

            {

            }

     

            [XmlArray("Patches"),XmlArrayItem("Patch",typeof(Patch))]

            public System.Collections.ArrayList patches = new System.Collections.ArrayList();

           

        }

     

        public class Patch

        {

     

            // Set this 'bool' field

            // to be an attribute of the root node.

            [XmlAttributeAttribute]       

            public bool forAttribute = false;

     

            // By NOT specifing any custom

            // Metadata Attributes, fields will be created

            // as an element by default.

            [XmlElement]

            public string Type;

            [XmlElement]

            public string Content;

            [XmlElement]

            public string XPathLocation;

     

        }

     

        static class XmlPatcher

        {

            public static void Patch(string patchFilename,string inputFilename,string outputFilename)

            {

                Patches p = new Patches();

                XmlSerializer serializer = new XmlSerializer(typeof(Patches));

                TextReader reader = new StreamReader(patchFilename);

                p = (Patches)serializer.Deserialize(reader);

                reader.Close();

     

                XmlDocument doc = new XmlDocument();

                doc.Load(inputFilename);

                foreach (Patch patch in p.patches)

                {

                    if (patch.forAttribute)

                    {

                        if (patch.Type.Equals("Change"))

                        {

                            XmlAttribute node = doc.SelectSingleNode(patch.XPathLocation) as XmlAttribute;

                            node.Value = patch.Content;

                        }

                        else

                            if (patch.Type.Equals("Apply"))

                            {

                                XmlAttribute node = doc.SelectSingleNode(patch.XPathLocation) as XmlAttribute;

                                XmlDocument temp = new XmlDocument();

                                temp.LoadXml(patch.Content);

                                node.AppendChild(doc.ImportNode(temp.ChildNodes[0], true));

                                //doc.RemoveChild(node);

                            }

                            else

                                if (patch.Type.Equals("ApplyAllElements"))

                                {

                                    XmlAttribute node = doc.SelectSingleNode(patch.XPathLocation) as XmlAttribute;

                                    doc.RemoveChild(node);

                                }

                                else

                                    Debug.Fail("Invalid path type for an attribute");

                    }

                    else

                    {

                        //For elements

                        XmlNodeList elements = doc.SelectNodes(patch.XPathLocation);

                        foreach (XmlElement element in elements)

                        {

                            if (patch.Type.Equals("Apply"))

                            {

                                XmlDocument temp = new XmlDocument();

                                temp.LoadXml(patch.Content);

                                element.AppendChild(doc.ImportNode(temp.ChildNodes[0], true));

                            }

                            else if (patch.Type.Equals("Remove"))

                            {

                                element.ParentNode.RemoveChild(element);

                            }

                            else if (patch.Type.Equals("Comment"))

                            {

                                XmlComment comment = doc.CreateComment(patch.Content + "\r\n" + element.OuterXml + "\r\n ********");

                                element.ParentNode.ReplaceChild(comment, element);

                            }

     

                        }

                    }

                }

                doc.Save(outputFilename);

                Console.WriteLine("File " + inputFilename + " has been patched. Results in " + outputFilename);

            }

     

        }

     

        class Program

        {

           

            /// <summary>

            /// Reads a Patches document. This document has the following form:

            /// <Patches>

            ///   <Patch xpath="...">

            ///     new xml

            ///   </Patch>

            /// </Patches>

            /// </summary>

            /// <param name="args"></param>

            public static void Main(string[] args)

            {

     

                XmlPatcher.Patch(args[0], args[1], args[2]);

                Console.WriteLine("File " + args[1] + " has been patched. Results in " + args[2]);

            }

        }

    }

     

  • Returning cursors in Oracle

    I recenlty had a hard time trying to return some cursos and used them in Excel.

    The problem is that Excel does not understand ref cursors. There are a couple of links in Microsoft. In general you have to use a special ODBC query syntax and create a package ????

    This is an example, I just copied from Microsoft


          DROP TABLE DATA1;

          CREATE TABLE DATA1
           (ssn     NUMBER(9) PRIMARY KEY,
            fname   VARCHAR2(15),
            lname   VARCHAR2(20));

          INSERT INTO DATA1 VALUES(555662222,'Sam','Goodwin');

          INSERT INTO DATA1 VALUES(555882222,'Kent','Clark');

          INSERT INTO DATA1 VALUES(666223333,'Sally','Burnett');

          COMMIT;
          /

          CREATE OR REPLACE PACKAGE packData1
          AS
              TYPE tssn is TABLE of  NUMBER(10)
              INDEX BY BINARY_INTEGER;
              TYPE tfname is TABLE of VARCHAR2(15)
              INDEX BY BINARY_INTEGER;
              TYPE tlname is TABLE of VARCHAR2(20)
              INDEX BY BINARY_INTEGER;

            PROCEDURE GetData
                  (param1 IN      Date,
                   ssn    OUT     tssn,
                   fname  OUT     tfname,
                   lname  OUT     tlname);
          END packData1;
          /


          CREATE OR REPLACE PACKAGE BODY packData1
          AS

          PROCEDURE GetData
                (param1  IN    Date,
                       ssn     OUT   tssn,
                       fname   OUT   tfname,
                       lname   OUT   tlname)
          IS
            CURSOR data1_cur IS
                       SELECT ssn, fname, lname
                       FROM Data1
                       WHERE param1 < current_date;
               percount NUMBER DEFAULT 1;
           BEGIN
               FOR singledata IN data1_cur
               LOOP
                       ssn(percount) := singledata.ssn;
                       fname(percount) := singledata.fname;
                       lname(percount) := singledata.lname;
                       percount := percount + 1;
               END LOOP;
           END;
           END;
           / 
          
    To call it you write in Excel something like {call packdata1.GetData('01-JAN-2005',{resultset 70000, ssn, fname, lname})}      

    {call packdata1.GetData(?,{resultset 70000, ssn, fname, lname})}    to use parameters.

    The microsoft links are:

    http://support.microsoft.com/default.aspx?scid=kb;en-us;Q174679

    http://www.support.microsoft.com/kb/174981

     

  • Easy way to start developing webparts

    Recently someone I one told me he was working with WebParts and that he was not happy about it.
    Developing WebParts is that hard but is even easier if you are familiar with simple web user controls.
    Some people from Reflection IT created a WebPart that allows you to reuse your web user controls. So I think it will very useful for anyone that is just starting with this
    Just look for SmartPart
    Cheers!
  • Expading or Shrinking your disks

        If you have been using VMWare for a while you'll end up having space problems.
    Either your virtual machine disks are TOO big or TOO small.
    To handle that VMWare Workstation has a tool (Notice that VMWare Server does not have it)
    Called vmware-vdiskmanager.exe (Virtual Disk Manager you can google it with "Virtual Disk Manager vmware")
    you will find it in C:\Program Files\VmWare WorkStation\

    to Expand a Disk you just do vmware-vdiskmanager.exe -x 40GB mydisk.vmdsk

    To Shrink files there are more steps to take. You must remove all snapshots if you had any. Then start the virtual machine, and install the vmwareTools and once you have installed then you go to the control panel Click in Vmware Tools and use the Shrinking features.

    Then you can use the vmware-vdiskmanager.exe -k command.

    You can find more details intructions in the VMWare site! Good Luck

Powered by Community Server (Non-Commercial Edition), by Telligent Systems