Sysprep User Profiles

10. November 2006 12:42 by smurillo in General  //  Tags:   //   Comments (0)

There are times when you would want to Sysprep a Windows image and get it ready to join a domain and start creating user profiles. But what if you want to control the configurations and contents of those future profiles?

Windows offers a location for a Default User Profile. It is a hidden folder normally located in %SystemDrive%\Documents And Settings\Default User. To create a default profile all you need to do is log in to the machine, make all the changes you need and then log off. Once you are done copy all the contents of your profile folder to the Default User folder. You will need to do this offline or by using another account.

Profiles folders contain a file called NTUSER.DAT, this file contains all the configurations that are located in the HKEY_CURRENT_USER registry entry when the respective user logs on.

In general all of this works for future profiles even if you are not using Sysprep. But when you do use Sysprep there is a particular case that is not contemplated here. When you set the machine to log in the first time using a particular user account, the contents of that local profile will be copied to the Default User Profile that first time. In those cases you should set the defaults using that account.

Moving from ADO to ADO.NET using the VB Upgrade Companion, Enterprise Edition

10. November 2006 10:31 by Jaguilar in General  //  Tags:   //   Comments (0)

One of the best features of the Visual Basic Upgrade Companion, Enterprise Edition, is the fact that it transforms your ADO code into ADO.NET. The Companion converts most of ADO features automatically, and it work correctly even if you choose to generate C# code.

One detail, though, is that the generated code by default uses the SQL Client for ADO.NET connections. This brings huge performance increases to the application, but we’ve run in to the situation in the past where the original datasource was not SQL Server. We’ve seen applications that used the Jet Database Engine, which is no longer supported by the latest version of MDAC, and is definitely not supported by ADO.NET’s SQL Client.

The solution for these scenarios is to use the Microsoft Access Upsizing Wizard. So far we haven’t seen any issues when upsizing the data, but there are other features that are not supported by the wizard. Once you upsize your database into a SQL Server installation (it even works with SQL Server 2005 Express Edition – which is great news for smaller installations), the final step in your application is to update the connection string used. The easiest way to get a hold of the new connection string is to create the connection inside Visual Studio 2005, and then copy the Connection String from the connection’s properties:

SQLSERVER

It is also important to mention that this and most other behaviors can be customized through our consulting services. We can also carry out the complete migration process as well.

SCVMM Self-service issues

10. November 2006 09:12 by Jaguilar in General  //  Tags:   //   Comments (0)

The self-service portal is one of the best features of System Center Virtual Machine Manager (SCVMM –  I have to say I can’t get used to the new name – Carmine still sounds more familiar), as it allows administrators to define policies for creating Virtual Machines, and then users themselves can create new VMs that comply with the limits set by IT (i.e.: Guest OS, amount of RAM, hard drive, etc). This greatly improves the efficiency of IT departments, and allows end-users to take control of the server and workstation provisioning process into their own hands.

During the development of our labs, we run into several issues with the Self-Service portal of SCVMM . After going through all the process to create templates and hardware and guest profiles, we kept running into issues with the template being disabled in the self-service portal. Well, it turns out that the issues had nothing to do with SCVMM  itself, but with the configuration on the target Virtual Server. Here are some points in the Virtual Server configuration you should check if you ever run into similar problems (the error messages are not that descriptive):

  • The host have enough RAM and disk space for the new VM
  • The host must have a default path for Virtual Machines. You can check this one on the web management console of Virtual Server, under Server Properties->Search paths->Default virtual machine configuration folder.
  • The host must have sufficient network adapters to support the amount specified in the template.

Our test Virtual Server installation, the default path was missing. Be sure to check these points out if you ever run into a similar situation!

Virtualization Labs registration now open

8. November 2006 06:34 by Jaguilar in General  //  Tags:   //   Comments (0)

Registration for the Virtualization labs we will be teaching next year is now open. The program will run from December, 2005 to May, 2006, and we will be presenting the content in Redmond, Spain, and several countries in Asia.

The labs are 3 days long, and in them we show you how to leverage the features of Virtual Server 2005 R2 SP1 from a developer perspective. You’ll learn how to script common management tasks, how to use Virtual Server 2005’s API to manipulate virtual machines and develop your own management applications, and how you can setup the System Center Virtual Machine Manager (a.k.a. Carmine) to manage Virtual Server installations.

You can see the complete schedule and sign up for the events at http://www.virtualizationevents.com/ .

Debugging XSL

8. November 2006 05:23 by Admin in General  //  Tags:   //   Comments (0)

Developing XSL can be sometimes cumbersome and tricky. Especially if it is something you don’t do every day.

Luckily Visual Studio 2005 now provides the an XSL debugger.

To debug an XSL open Visual Studio and open a Project go to the File Menu \ Select New File and Create a New XSLT file.

Write your XSL file.

You can set breakpoints just by clicking on the left side of the editor just like you do for VB.Net of C#.

Now to test it right click on the editor and select properties:

In the properties for the XSL type a name on the

The XML menu provides two options:

The Show XSLT output will run the complete XSL and let the XSL Output in a new window. The output by default is not formatted. You can go to the Edit\Advanded\FormatDocument option to format it.

The Debug XSLT option will start the debugger and stop in the breakpoints you specified.

Press F10 or F11 to dig into the file. You can use the call stack windows and even the vales for variables in the Quick Watch and Watch Windows.

You can write XPAth Expression in the Quick Watch Dialog.

There are three special values that are handy when debugging:

last() is the context size, position() is the position, or index number, of the context node, relative to the context size; and self::node() is the value of the context node.

And enjoy your debugging experience ;)

VHD Test Drive

6. November 2006 04:30 by Jaguilar in General  //  Tags:   //   Comments (0)

A couple of weeks ago I made a post about pre-configured virtual machine images. Well, it turns out that the program is now official, and it is called VHD Test Drive. You can read about it in this press release. With this program, you can download virtual machine VHDs that contain pre-configured Microsoft’s server products, so you can try them out easily. Third party support for the program is expected later. From the press release:

These virtual machines, which are provided in Microsoft’s virtual hard disk image format, are pre-built and pre-configured so that they can be downloaded or distributed for easy setup and evaluation. This allows customers to evaluate software in a fraction of the time it usually takes, such as setting up SQL Server 2005 in minutes instead of hours.

The VHD Test Drive Program is a first for Microsoft software and the more than 7,000 software vendors who can now deliver pre-configured applications within Windows Server-based virtual machines to their customers. Today the program launches with the latest versions of Windows Server 2003 R2 Enterprise Edition, SQL Server 2005 Enterprise Edition SP1, Microsoft Exchange Server 2007 (32-bit beta) with Microsoft Office Live Communications Server 2005, and Internet Security & Acceleration (ISA) 2006 Standard Edition. Partners and customers can expect to see additional Microsoft software added to this program.

You can check out the press release here, and read more about the program on the VHD Test Drive page.

A Migration-related PM blog

3. November 2006 13:20 by jpena in General  //  Tags:   //   Comments (0)

After more than 3 years of managing migration projects here in ArtinSoft, I have decided to start this Project Management blog.  In this blog, I would like to share some of the experiences and knowledge that we have accumulated during this time on how to deal with the complex task of leading an application migration project.  I hope that the information posted here can be useful to Project Managers and Development Leaders that are in charge of migration projects. 

Please stay tuned!

RDC on a Mac (OS X)

2. November 2006 13:43 by Csaborio in General  //  Tags:   //   Comments (0)
Even though there are not many Macs at Artinsoft (2, I believe :) this might come in handy for someone who needs an efficient remote desktop connection.  Even though Microsoft makes a RDC client for Macs, running it on an Intel mac can be a bit of a drag.  Rosetta apps (applications that do not run natively on Intel macs) are kinda sluggish when launching.   Also, if you need to run various instances of RDC, you would need to make copies of the app itself (or use this utility).

Luckily, there are various free alternatives out there that work like a charm.  My personal favorite is CorD (cocoa remote desktop).  It is lightweight, fast, free, and offers tabbed windows for various simultaneous connections.  The only con I have found so far is that it does not support copy paste.

You can also use TSClient, which has more features than CorD but unfortunately requires the installation of x11.  While this may not be a big issue, some people are not very fond of running programs under x11 for performance reasons.  TSClient is the client that most resembles the official Microsoft client and it even offers several features that the official client does not have.

The New VMware Converter

2. November 2006 12:30 by Csaborio in General  //  Tags:   //   Comments (0)
The race between Microsoft and VMWare for the virtualization space can only offer benefits to the end user.   The close competition will push the limits of both Microsoft and VMWare in offering the best of each other.  Point in case is the (beta) release VMWare's Converter.

The VMWare converter makes the process of moving a physical machine to a virtual a painless process.   So far in our tests, we've managed to hack our way with some unconventional methods, but these take a lot of time.   The VMWare tools offers a new level of Physical to Virtual (P2V) conversion by having a manager that can queue operations for this process.   It is fully scriptable as well, which can only simply and make the whole process more efficient for system administrators. 

Microsoft is not falling behind in this area.  The Virtual Machine Manager has plans for not only fully automating P2V conversions but guiding you on the best Virtual Server where the new physical machine can be.  Unfortunately, this is not currently supported at the beta stage that the product is right now, but from demos I have seen I am sure it will be a sure contender to VMWare's offerings.

For more info on VMWare's Converter visit this page and for Microsoft's Virtual Machine Manager info, check this site out.

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

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

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="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]);

        }

    }

}

 

MSDN Pre-Configured Virtual Machine Images

24. October 2006 08:30 by Jaguilar in General  //  Tags:   //   Comments (0)

If you are a MSDN subscriber, you have access to Virtual Machine images that are preconfigured with most Microsoft’s products:

MSDN Subscribers have access to a series of Virtual Images containing a fully functional installation of Windows Server 2003, SQL Server 2005, Visual Studio 2005 Team Suite, and Visual Studio 2005 Team Foundation Server. These Virtual Images are a benefit of your MSDN subscription and are available for download from the MSDN Subscriber download area.

I copied the paragraph above from Visual Studio’s Evaluation page. You do need to have an MSDN subscription to access these images. They are a great way to evaluate Microsoft’s products without commiting a physical machine to the evaluation, or having to spend time installing and configuring a server.

This is another great example of how virtualization is making our lives easier!

VHD Spec Available for Download

19. October 2006 12:24 by Jaguilar in General  //  Tags:   //   Comments (0)

The VHD format specification is now available for download. The specification contains all the technical details for reading/writing and modifying VHD images. This has a lot of potential, and can be used for things like backup, antivirus scans, image management, disk conversion, and others. The spec was released under Microsoft’s Open Specification Promise:

As of Tuesday, October 17th 2006, Microsoft is providing access to the VHD Image Format Specification Document as a part of the Open Specification Promise (OSP). The OSP provides broad use of Microsoft patented technology necessary to implement a list of covered specifications. The goal of the OSP is to provide our customers and partners with additional options for implementing interoperable solutions. Please reference the OSP Website for complete details.

Link to the Press Release: Microsoft Enhances Interoperability With Open Virtualization Format
Link to download page: Virtual Hard Disk Image Format Specification

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


      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

 

Using vhdmount.exe under Windows 2003 Server R2

15. October 2006 11:18 by Jaguilar in General  //  Tags:   //   Comments (0)

When you try to mount a VHD using the vhdmount tool, you may get this error message:

C:\VMs>vhdmount.exe /m DISK.vhd

The VHD file is successfully plugged in as a virtual disk device. However, VHD mount was unable to mount all volumes on the disk. Use Disk Manager to mount the volumes.

The issue is that the drivers are not signed for WHQL, so you need to follow the same steps as detailed in this blog post to make it work (as in Windows XP). Another option, however, is to set the WHQL signing option is to Ignore. This can be done through Control Panel->System->Hardware->Driver Signing:

VHDMOUNT

Once you do this, you’ll be able to mount VHD files without any further errors.

HP and Intel Developer Workshops - Atlanta

12. October 2006 12:44 by Jaguilar in General  //  Tags:   //   Comments (0)

There’s going to be a new HP and Intel Developer Workshop in Atlanta in a couple of weeks, on Oct. 24–26. As with the previous workshops, we will do the classes for the 64–bit Windows track.

This is the last workshop for this year. That means that is the last oportunity this year to get this hands-on traning AND an Itanium machine!!

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
Cheers!

Categories