LINQ Project

31. December 2006 07:10 by Mrojas in General  //  Tags:   //   Comments (0)
These project extends the VB and C# languages with query, set and transforms operations. It adds a native syntax for those operations.


The idea of the LINQ project is to make data manipulation part of the language constructs. Lets see these VB examples for LINQ:


The following examples associates the Customer class to the Customer table. Just adding the Column Tag before a field, maps it to a table column.


    <Table(Name:="Customers")> _

    Public Class Customer

        <Column(Id:=True)> _

        Public CustomerID As String


        <Column()> _

        Public City As String


    End Class

To access the database you do something like:

' DataContext takes a connection string

Dim db As DataContext = _
        New DataContext("c:\...\northwnd.mdf")

      'Get a typed table to run queries

      Dim Customers As Table(Of Customer) = db.GetTable(Of Customer)()

      'Query for customers from London

        Dim q = _

          From c In Customers _

          Where c.City = "London" _

          Select c


      For Each cust In q

          Console.WriteLine("id=" & Customer.CustomerID & _

              ", City=" & Customer.City)



You just create a DataContext and create typed object that will relate dot the relational tables. I think this is awesome!!


It is even nicer if you create a strongly typed DataContext


    Partial Public Class Northwind

        Inherits DataContext

        Public Customers As Table(Of Customer)

        Public Orders as Table(Of Order)

        Public Sub New(connection As String)



Your code gets cleaner like the following:

    Dim db As New Northwind("c:\...\northwnd.mdf")


    Dim q = _

        From c In db.Customers _

       Where c.City = "London" _

        Select c


      For Each cust In q

          Console.WriteLine("id=" & Customer.CustomerID & _

              ", City=" & Customer.City)




These project will start a lot of exciting posibilities. I recommed you have a look at’:




Thin Clients or Rich Clients

31. December 2006 06:26 by Mrojas in General  //  Tags:   //   Comments (0)

This is an old topic but I always like to give some thoughts on this idea.  I really think that in the future everything will run from the internet. Internet is becoming another basic need just as electricity, water, gas and telephone. The appearance of new technologies makes it easy to have Internet even in remote places like beaches and mountains.

Rich Clients have been defended because it was said that not a lot of interactivity could be produced by thin clients. It has also been said that powerful interfaces (with complex gadgets, etc) could be produced in a web interface. I think that Flash, and AJAX have shown that despite all believes it is possible. There are still more technologies that will come. But the easier deployment and the fact that you can use your web applications everywhere even from a cell phone in a taxi cub.


I also love phases like “If you ask an engineer the time, he'll tell you how to build a clock.”. Web interfaces are simple and easy to learn look at blogs like Jon Galloway and Microsoft's Inductive User Interface (IUI) initiative it seams like more people is starting to think in this way.


29. December 2006 07:14 by Mrojas in General  //  Tags:   //   Comments (0)

Migrating ASP to ASP.NET


Surpinsingly for me. I found that some friends were working on migrating an ASP classic site to ASP.NET. I was impressed to see that there are still sites in ASP classic at ALL!!!!

ASP.NET 2.0 provides so much improvements, you cannot even debug in ASP. ASP.NET 2.0 has better performance and easier to deploy. There is even Intellisense! These days is hard for me not assuming that all IDEs provide the developer aids like that.


Also migrating simple ASP classic code to ASP.NET is not that hard.

Let’s see a simple ASP classic page like:



Dim objConn

Dim objRS

Set objConn = Server.CreateObject(“ADODB.Connection”)

Set objRS = Server.CreateObject(“ADODB.Recordset”)

objConn.ConnectionString = “DRIVER=(SQL Server);server=…”


objRS.Open “SELECT * from Items”, objConn

Do While Not objRS.EOF

     Response.Write CStr(objRS(“ID”)) + “ – “ + objRS(“Description”) + “<br>”






Migrates easily to:


<%@ Page aspcompat=true Language=”VB” AutoEventWireUp=”false” CodeFile=”Default.aspx.vb” >


Dim objConn

Dim objRS

Set objConn = Server.CreateObject(“ADODB.Connection”)

Set objRS = Server.CreateObject(“ADODB.Recordset”)

objConn.ConnectionString = “DRIVER=(SQL Server);server=…”


objRS.Open (“SELECT * from Items”, objConn)

Do While Not objRS.EOF

     Response.Write (CStr(objRS(“ID”).Value) + “ – “ + objRS(“Description”).Value + “<br>”)







These are the task to do:

  1. Remove SET
  2. Any method in ASP.NET requires its parameters to go inside parenthesis
  3. ASP.NET does not have default properties so elements as objRS(“ID”) must be changed to objRS(“ID”).Value and objRS(“Description”) to objRS(“Description”).Value
  4. you must add the aspcompat=true property to the page because of the apartment threading issues
  5. You should change statements like Dim objRS to Dim objRS as Object it is not an error but it will help you make your code more clear.


You can also download the Migration Assitant from ASP to ASP.NET from:


Starting with the internationalization bla bla (Part Two)

27. December 2006 10:50 by Mrojas in General  //  Tags:   //   Comments (0)
Ok enough theory. To start using the internationalization stuff lets start with a simple Form.

Open  the Visual Studio IDE. And Start a Windows Forms project. And then create a simple Form. Add some labels and buttons and set their captions. Once you do that and finish the initial creation of the form, go to the properties pane and change the Localizable property to true and assign the desired value in the Language property. The Visual Studio designer will save the changes in additional resource files whose names will look like <FormName>.<culture>.resx

Once you finish the texts, sizes, positions for the first culture and save it. The IDE creates the resource file for that culture. If you want to create a resource file for another language just change the Form property and assign the text for this new language.


You can not only assign personalized translations for each region but also the position and size of components. This is useful because in some languages the buttons might need to be bigger because the labels could be bigger.


All this work is supported by the .NET resource managers. System.Resources.ResourceManager class.


I recommend you also using String Resource Tools like the ones at:


These tools makes it even easier the task of moving all your strings to resource files:


Taking an application to the whole world (Series 1 of 3)

27. December 2006 03:59 by Mrojas in General  //  Tags:   //   Comments (0)

Recently I was asked by some fellows some help to make a new version of their VB6 application in Spanish, but at the end we end up migrating the application to VB.Net and taking advantage of the .NET internationalization features.


VB6 did not provided and out-of-box support for multiple cultures, but the .NET framework provides the developer with utilities to create applications that allow users in multiple regions use their applications according to their “Culture”.


The .Net Framework is able to handle different cultures. These “cultures” are used to localize certain aspects of the application for particular geographic zones.

When an application is not created with any cultural considerations it is said to use a Neutral Culture. It implies that independent of the machine configuration it will behave and display components in the same way.


The Culture is assigned automactically using the machine settings or it can be altered programmatically. You can use the property System.Globalization.CultureInfo.CurrentUICulture for that purpose.


Cultures have two elements: language and region. For example for Argentina where Spanish is spoken la culture will be es-AR (es is for Spanish: ESpañol and AR for Argentina)


If no information is found at all for an language then the neutral culture is used.


The information for user display is handler in assemblies usually called “satellite assemblies” which are loaded depending on the culture of the environment where the application is executed.


Is .NET hotter that Java

21. December 2006 11:44 by Mrojas in General  //  Tags: ,   //   Comments (0)
This is a very controversial topic. Recently I have seen several blogs that state that the VB6 Programmers are moving to other platforms like PHP or Java instead of VB.NET
For example see:
Number of VB Developerts Declining in US
By Steve Graegert
“They’re also leaving VB.NET; which is down by 26%. This means Java now holds the market penetration lead at 45% (with developers using Java during some portion of their time), followed by C/C++ at 40%, and C# at 32%.”

I also remember an Article I read in 2005 in JDJ (Java Developers Journal) that expressed that C# was a language created similar to C++ to aid the C++ programmers move to the .NET Framework, argument that I do not share.

I have no evidence but I do not feel that it is that way. I'm am a Java Developer too. And both platforms have their merits. C# is a nice language, very similar to Java and C++ no doubt but it deserves its own place. Visual Studio has still a path to follow. But VS2005 provides some useful refactorings and the incredibly awaited feature that allows you to edit the code that you're running :)

Maybe the 1.0 and 1.1 frameworks were not enterprise ready, but 2.0 and 3.0 frameworks are an excellent improvent.

Java as well had to go thru a lot of JDK releases. They have just released the 1.6 and what about the J2EE releases, the Java Enterprise Beans fiasco. You can confirm that by looking at the rise of POJO (Plain Old Java Object) frameworks like spring.

In general everything requires time to grow. I think that Java has been more time in the market and it has finally provided mechanisms that allow the development of enterprise services "easier" and it is giving it momentum.

.NET components industry is common, there are lots of components and somethings are easier. So I'll wait some time, maybe a couple of year to really find out which is the hotter platform.

Invoke a WebService that needs Windows Authentication

1. December 2006 10:22 by Mrojas in General  //  Tags:   //   Comments (0)

Passing client credentials to a Web service using Windows authentication

Sometimes a Web Service is under a configuration that requires Windows Authentication. It is not a problem for .NET, all you need to do is set your environment to send the client credentials.
  1. First Create a Reference to a Web Service:

To do that just go to the references of your project and add a Web Reference. Type the URL of your web service. This will find your Web Service Reference and you can update it. This will generate the proxy code you need to access your webservice.

If you try to call your webservice with a call like:

WebReference.MyService pService = new WebReference.MyService ();
pService.doStuff("A", "B");

You’ll get a HTTP 404 forbidden access exception.

Now to send the user and password to call your service write some code like the following:

WebReference.MyService pService = new WebReference.MyService ();
pService.Credentials = new System.Net.NetworkCredential("user", "password");
pService.doStuff("A", "B");

You can also send the domain name as part of the parameter to the NetworkCredential class:

pService.Credentials = new System.Net.NetworkCredential("user", "password","domain");

It will be even better to have your user and password not in your code but in the configuration file for your program. You can then use the AppSettings class to access those properties.

ToolTip with Images

1. December 2006 06:30 by Mrojas in General  //  Tags:   //   Comments (0)

The Tooltips that comes out of the box for winforms do not support images on them. This is a simple class that allows you to add Images and Text to your ToolTips

using System;

using System.Windows.Forms;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

namespace CustomControls


class ToolTipWithImage : Control


private Image _img;

private Control _ctl;

private Timer _timer;

string _imgfilename;

string _tiptext;

public String TipText


get { return _tiptext; }

set { _tiptext = value; }


public String ImageFile




return _imgfilename;




if (_imgfilename == value)





_imgfilename = value;



_img = Image.FromFile(_imgfilename);

this.Size = new Size(_img.Width + 70, _img.Height);




_img = null;





public ToolTipWithImage()


this.Location = new Point(0, 0);

this.Visible = false;

_timer = new Timer();

_timer.Interval = 1000;

_timer.Tick += new EventHandler(ShowTipOff);


public void SetToolTip(Control ctl)


_ctl = ctl;


ctl.Parent.Controls.SetChildIndex(this, 0);

ctl.MouseMove += new MouseEventHandler(ShowTipOn);


protected override void OnPaint(PaintEventArgs e)


if (_img != null)


e.Graphics.DrawImage(_img, 0, 0);

e.Graphics.DrawString(TipText, this.Font, Brushes.Black, _img.Width, 0);



public void ShowTipOn(object sender, MouseEventArgs e)


if (!this.Visible)



this.Left = _ctl.Left + e.X + 100;

this.Top = _ctl.Top + e.Y;

this.Visible = true;



public void ShowTipOff(Object sender, EventArgs e)



this.Visible = false;






To use it just do something like

ToolTipWithImage timg = new ToolTipWithImage();

timg.TipText = "Hello";

timg.ImageFile = @"C:\Hello.gif";


Safe Migration to VB.NET

27. November 2006 05:44 by Mrojas in General  //  Tags:   //   Comments (0)
    My colleague Juan Pastor forward us an interesting link. It was called "Safe Migration to VB.NET". By Phillip Munce.
He provides an interesting point of view of how to address a migration. He's approach is based on the Agile Development strategies.
Mainly he states that a good way to address a migration project is developing a set of Unit Test cases. For which you could use either NUnit or the Visual Studio Team System.
In that way is easier to establish a measure that let's you know when the project is migrated if it meets the original application test cases.
He also sees it as an oportunity to document and improve maintability for the application.
Here at Artinsoft we also give special attention to testing and the establishment of the test case scenarios because they are our main tool to determine the "Functional Equivalence"
 of the application being migrated which is the goal of most of our clients.
Testing is not always appreciated by developers but as applications grow and maintability becomes complicated, it is harded and harder to keep track that new functionality and patches do not destroy the rest of your application.
Take a look at Phillips Blog here.

Creating a Scheduled job in ORACLE

22. November 2006 06:41 by Mrojas in General  //  Tags:   //   Comments (0)

This is easily done with the Oracle 10g interface, there is a nice article that explains that in at this address

However sometimes you don't have access to the Administrative UI. Is there another way to create or schedule jobs?

Sure just use the he DBMS_SCHEDULER package.

There are several things you should do:



3. Create Scheduler Program:

         SELECT * FROM TABLE2;
      comments=>'Loads a table from another',

 4. Create a schedule program:

      repeat_interval =>   
      start_date => 
         to_timestamp_tz('2006-11-22 US/Eastern', 'YYYY-MM-DD TZR'),
      comments => 
         'Schedule for periodic loads',
      schedule_name => '"MYUSER"."DOLOADS"');


5. And finally link both together to create a JOB:

      job_name => '"MYUSER"."JOB1"',
      program_name => 'MYUYSER.PROGRAM1',
      schedule_name => 'MYUSER.DOLOADS',
      job_class => 'DEFAULT_JOB_CLASS',
      comments => 'Loads a table',
      auto_drop => FALSE,
      enabled => TRUE);

At least this is how I did it. This is just a quick summary of the following article:




17. November 2006 11:08 by Mrojas in General  //  Tags:   //   Comments (0)

ASP.NET AJAX 1.0 Beta 2 (formerly code-named “Atlas”) is now available for download.

ASP.NET AJAX allows creating great responsive interfaces. I think this framework was previously called “Atlas” you might even find a document on the site describing how to migrate your Atlas applications to this release.

Recently I reviewed the samples at These are some of my impressions:


à à



I t allows to add effects to pages, the examples popups a region. You can do a lot more.


This is very simple a common scenario where the combo box values depends of what you select on another combo.


It adds an widget to the panel that allow it to collapse.


Just for the typical are you sure!


Cool!! It lets you create windows that you can drag around.


Add a nice style of menus


Mmm just add a shadow to your panels


:/ it just like a way to generate something in the server with ajax. I really don’t get it a lot.


Client side validations


I think is handly is a way to display additional info for web page element and only show them when needed


I like this!! It really lets the user focus on what you want


Not that sexy but useful in some cases when you have several check boxes options and some contradict the other.


This control avoids entries by automated processes (BOTS)


The name says it all


I have never needed this but looks nice


Nice. It gives feedback to the user indicating if his/her password is good enough


Nice!! It adds popability to any control. You can use it to make data entry easier


Jejeje Starts rating control


Is a list where you can drag the items to reorder them and the datasource will be updated


Great! Resizable images and text containers. I suppose it can be also applied to other things.


:/ not very exciting just adds rounded corners to panels


Slider controls


Displays a message in a textbox before the user enters some text. After he enter the text the message disappears.


Modifies checkboxes to use images


Adds effects to panels things like fade and Collapsing and background changes


Very nice


15. November 2006 18:13 by Mrojas in General  //  Tags:   //   Comments (0)


Microsoft has develop the Microsoft Build Engine (MSBuild). This is the new build platform for Microsoft and Visual Studio. It is an XML configuration (very similar to other build tools like ANT) It allows to orchestrate and build products in build lab environments where Visual Studio is not installed.

It is a great aid with other tools like CruiseControl.NET, relation that I will further elaborate in other posts.

The following is very simple MSBuils script

<Project xmlns="">


<Target Name="HelloWorld">

<MakeDir Directories= "bin"/>

<Csc Sources="HellWorld.cs" TargetType="exe"

OutputAssembly=".\bin\HelloWorld.exe" />



This sample shows the basic structure of an MSBuild. This is a very basic script maybe not very useful, but general scripts will be made up of Several Targets, Properties and some dependencies between them.


To define properties just define your tags inside a <PropertyGroup> Tag. If you want for example to define an OutputPath property just do something like:


And to use it just reference it as $(OutputPath)

Groups of files

You can specify groups of files with the ItemGroup tag


<File_Image Include="$(OutputPath)\Image.jpg"/>

<cs_source Include=".\*.cs" Exclude=".\Foo1.cs" />


And you will reference them like @(File_Image) and @(cs_source).

Dependencies between Targets

<Target Name="CreateOutputPath" Condition="!Exists('$(OutputPath)')">

<MakeDir Directories= "$(OutputPath)"/>


<Target Name="FooCompilation" DependsOnTargets="CreateOutputPath"

Inputs=" Foo1.cs"



J2EE and .NET Integration

1. November 2006 08:26 by Mrojas in General  //  Tags:   //   Comments (0)
   Artinsoft provides means to migrated Java Applications to .NET. However as with many medium size to large applications it could be a complex task.
Sometimes due to cost or time restrictions just a portion of the system is migrated. The migration team analyses the code and determines which are the "connection points" or the areas where both systems are connected and therefore, means must be develop to provide communications between the Java and the .NET world.
There are many alternatives.
If you're facing this problem I will recommend the following references:

 Microsoft .NET and J2EE Interoperability Toolkit  by Simon Guest
He also published an interesting article where he recommends a products like Javena, and JNBridge
You can also check out JIntegra

Coverage Tool for C#

26. October 2006 08:18 by Mrojas in General  //  Tags:   //   Comments (0)
I recently checkout NCover
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,

VB.NET to C# Comparison

25. October 2006 04:04 by Mrojas in General  //  Tags:   //   Comments (0)

    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

"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
Char   (example: "A"c)
Short, Integer, Long
Single, Double

Reference Types

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
byte, sbyte
char   (example: 'A')
short, ushort, int, uint, long, ulong
float, double
DateTime   (not a built-in C# type)

Reference Types

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 AsInteger = 25

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

constint 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
  [Stop]   ' Stop is a reserved word
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#

=  <  >  <=  >=  <>

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

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

And   Or   Not   <<   >>

AndAlso   OrElse   And   Or   Xor   Not

Note: AndAlso and OrElse perform short-circuit logical evaluations

String Concatenation
&   +

==  <  >  <=  >=  !=

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

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

&   |   ^   ~   <<   >>

&&   ||   &   |   ^   !

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 _

'If x > 5 Then
  x *= y
ElseIf x = 5 Then
  x += y
ElseIf x < 10 Then
  x -= y
  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?";
  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.

(x > 5)
  x *= y;
else if (x == 5)
  x += y;
else if (x < 10)
  x -= y;
  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

Do While c < 10
  c += 1

For c = 2 To 10 Step 2

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

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

' 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

Pre-test Loops: 

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

for (c = 2; c <= 10; c += 2)

Post-test Loop:

while (c < 10);

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

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

// Continue to next iteration
for (i = 0; i < 5; i++) {
  if (i < 4)
  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

' 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++)

// 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
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.")

// Pass by value (in, default), reference (in/out), and reference (out)
void TestFunc(int x, ref int y, out int z) {
  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

' 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

// 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
  y = 0
  x = 10 / y
Catch ex As Exception When y = 0 ' Argument and When is optional
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
  y = 0;
  x = 10 / y;
catch (Exception ex) {   // Argument is optional, no "When" keyword 
finally {
  // Requires reference to the Microsoft.VisualBasic.dll
  // assembly (pre .NET Framework v2.0)


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
Protected Friend

' 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
protected internal

// 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
  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

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
    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)
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) = name
    Me.gpa = gpa
  End Sub
End Structure

Dim stu As StudentRecord = New StudentRecord("Bob", 3.5)
Dim stu2 As StudentRecord = stu = "Sue"
Console.WriteLine(    ' Prints Bob
Console.WriteLine(  ' Prints Sue

struct StudentRecord {
  public string name;
  public float gpa;

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

StudentRecord stu = new StudentRecord("Bob", 3.5f);
StudentRecord stu2 = stu; = "Sue";
Console.WriteLine(;    // Prints Bob
Console.WriteLine(;   // Prints Sue

VB.NET Properties C#

Private _size As Integer

Public Property Size() As Integer
    Return _size
  End Get
  Set (ByVal Value As Integer)
    If Value < 0 Then
      _size = 0
      _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;
      _size = value;


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.")

' 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
  line = reader.ReadLine()
End While

' 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")) 

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

using System.IO;

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

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

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

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

Win32 APIS to .NET

25. October 2006 03:47 by Mrojas in General  //  Tags:   //   Comments (0)
 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

24. October 2006 10:56 by Mrojas in General  //  Tags:   //   Comments (0)
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="" xmlns:xsd="">>

 <!-- Sample Patch -->


    <Patch forAttribute="false">



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




   <!-- Commenting -->

    <Patch forAttribute="false">



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




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()





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




    public class Patch



        // Set this 'bool' field

        // to be an attribute of the root node.


        public bool forAttribute = false;


        // By NOT specifing any custom

        // Metadata Attributes, fields will be created

        // as an element by default.


        public string Type;


        public string Content;


        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);



            XmlDocument doc = new XmlDocument();


            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;



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


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

                            XmlDocument temp = new XmlDocument();


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




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


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




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




                    //For elements

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

                    foreach (XmlElement element in elements)


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


                            XmlDocument temp = new XmlDocument();


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


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




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


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

                            element.ParentNode.ReplaceChild(comment, element);







            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

17. October 2006 10:07 by Mrojas in General  //  Tags:   //   Comments (0)

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


       (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');


          TYPE tssn is TABLE of  NUMBER(10)
          TYPE tfname is TABLE of VARCHAR2(15)
          TYPE tlname is TABLE of VARCHAR2(20)

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


      PROCEDURE GetData
            (param1  IN    Date,
                   ssn     OUT   tssn,
                   fname   OUT   tfname,
                   lname   OUT   tlname)
        CURSOR data1_cur IS
                   SELECT ssn, fname, lname
                   FROM Data1
                   WHERE param1 < current_date;
           percount NUMBER DEFAULT 1;
           FOR singledata IN data1_cur
                   ssn(percount) := singledata.ssn;
                   fname(percount) := singledata.fname;
                   lname(percount) := singledata.lname;
                   percount := percount + 1;
           END LOOP;
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:;en-us;Q174679


Easy way to start developing webparts

12. October 2006 09:09 by Mrojas in General  //  Tags:   //   Comments (0)
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

Expading or Shrinking your disks

5. October 2006 06:52 by Mrojas in General  //  Tags:   //   Comments (0)
    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