Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET
Converting between C# and VB.NET Converting between C# and VB.NET
Converting between C# and VB.NET
Go Back  Xtreme Visual Basic Talk > > > Converting between C# and VB.NET


Reply
 
Thread Tools Display Modes
  #1  
Old 09-24-2009, 01:52 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default Converting between C# and VB.NET


In relation to my other thread (Force feedback) I would like to convert an online C# example to VB.NET for use in my project. (sample code located here http://69.10.233.10/KB/directx/forcefeedback.aspx)

I tried using an online converter but I don't have the knowledge to get the code it gave me together in the right places to make it work.

Would somebody please be able to do me a huge favour by converting the code to VB 2008 and either telling me where to put each section in my project or better still, uploading it as a VB project for me to download and play with?

Thanks
Chris
Reply With Quote
  #2  
Old 09-24-2009, 02:19 PM
AtmaWeapon's Avatar
AtmaWeaponConverting between C# and VB.NET AtmaWeapon is offline
Fabulous Florist

Forum Leader
* Guru *
 
Join Date: Feb 2004
Location: Austin, TX
Posts: 9,500
Default

It's not really that hard to convert yourself. I find that most of the time "I can't read C#" is a product of not even bothering to try. How about you try it and ask questions about the parts that confuse you?

Here's some hints based on what I see in the example article:

Variable declaration:
C#: <access> <type> <name>
VB .NET: <access | Dim> <name> As <type>
Code:
Device dev // C#
Dim dev As Device ' VB .NET
Null:
C#'s null is the same as VB .NET's Nothing.

Bitwise Operators:
Code:
Operation | C# | VB .NET
------------------------
And       | &  | And
Or        | |  | Or
Xor       | ^  | Xor
Arrays:
C# uses [] instead of () and the index you specify indicates the size of the array, not the upper bound. C# arrays are initialized with a kind of constructor syntax instead of ReDim:
Code:
int[] values = new int[5]; // C#
Dim values(4) As Integer ' VB .NET

int[] values;               // C#
values = new int[someValue]; // C#
Dim values() As Integer     ' VB .NET
ReDim values(someValue - 1) ' VB .NET
Casting:
C# doesn't have cast methods like CInt() or CType(). Instead, it uses a syntax like:
(<type>)<variable>
Code:
int value = (int)someClass.SomeProperty // C#
Dim value As Integer = CType(someClass.SomeProperty, Integer) ' VB .NET
= vs. ==:
C# has two operators that use the = sign. = is assignment, == is equality. For example:
Code:
someVariable = 5; // C#
if (someVariable == 5) // C#
someVariable = 5 ' VB .NET
If someVariable = 5 Then ' VB .NET
Practically everything else is minor differences in the syntax of control structures. I do not believe for a moment you can't translate foreach (DeviceObject doi in Dev.Objects) to For Each doi As DeviceObject In Dev.Objects yourself.
__________________
.NET Resources
My FAQ threads | Tutor's Corner | Code Library
I would bet money 2/3 of .NET questions are already answered in one of these three places.
Reply With Quote
  #3  
Old 09-25-2009, 01:41 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default

Thanks AtmaWeapon

I am away this weekend but will have a look next week at translations.

Doubtless I will have many problems so will post as I run into them. My main issue is knowing where to put certain pieces of code from the example. Most of it makes sense to me but there are a couple of bits that have thrown me.


Quote:
Originally Posted by AtmaWeapon View Post
It's not really that hard to convert yourself. I find that most of the time "I can't read C#" is a product of not even bothering to try. How about you try it and ask questions about the parts that confuse you?

Here's some hints based on what I see in the example article:

Variable declaration:
C#: <access> <type> <name>
VB .NET: <access | Dim> <name> As <type>
Code:
Device dev // C#
Dim dev As Device ' VB .NET
Null:
C#'s null is the same as VB .NET's Nothing.

Bitwise Operators:
Code:
Operation | C# | VB .NET
------------------------
And       | &  | And
Or        | |  | Or
Xor       | ^  | Xor
Arrays:
C# uses [] instead of () and the index you specify indicates the size of the array, not the upper bound. C# arrays are initialized with a kind of constructor syntax instead of ReDim:
Code:
int[] values = new int[5]; // C#
Dim values(4) As Integer ' VB .NET

int[] values;               // C#
values = new int[someValue]; // C#
Dim values() As Integer     ' VB .NET
ReDim values(someValue - 1) ' VB .NET
Casting:
C# doesn't have cast methods like CInt() or CType(). Instead, it uses a syntax like:
(<type>)<variable>
Code:
int value = (int)someClass.SomeProperty // C#
Dim value As Integer = CType(someClass.SomeProperty, Integer) ' VB .NET
= vs. ==:
C# has two operators that use the = sign. = is assignment, == is equality. For example:
Code:
someVariable = 5; // C#
if (someVariable == 5) // C#
someVariable = 5 ' VB .NET
If someVariable = 5 Then ' VB .NET
Practically everything else is minor differences in the syntax of control structures. I do not believe for a moment you can't translate foreach (DeviceObject doi in Dev.Objects) to For Each doi As DeviceObject In Dev.Objects yourself.
Reply With Quote
  #4  
Old 09-30-2009, 12:58 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default

I have translated the code to VB.NET.

I know some of it will need to go in 'Private Sub Form1_Load' but I wasn't sure about it all so I put it all there.

I have 2 errors so far:

1. 'Statement cannot appear within a method body. End of method assumed'. Refers to the following line
Code:
Namespace ForceFeedbackExample

2. 'End Sub must be preceded by a matching Sub'. I know why this happens usually but nothing seems wrong this time, I have
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
at the beggining of my code.

I will post the translation of the code as well as the original in another couple of posts.

Last edited by 01chris; 09-30-2009 at 01:03 PM.
Reply With Quote
  #5  
Old 09-30-2009, 12:59 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default Original code

Original C# code

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.DirectX;
using Microsoft.DirectX.DirectInput;

namespace ForceFeedbackExample
{
 
    public sealed class DirectInputWrapper
    {
        #region ForceType
        /// <summary>
        /// This enumeration simply provides a shorthand way to reference
        /// the custom forces we create -- it's not a base part of DirectX,
        /// though, so you can use a completely different method.
        /// </summary>
        public enum ForceType
        {
            VeryBriefJolt,
            BriefJolt,
            LowRumble,
            HardRumble
        }
        #endregion

        //this class lets us send FF commands to up to two game pads,
        //but your own class could support as many as you want
        private static Device device1;
        private static Device device2;

        private static Dictionary<ForceType, EffectObject> P1Forces;
        private static Dictionary<ForceType, EffectObject> P2Forces;

        #region Initialize
        /// <summary>
        /// Initialize DirectInput
        /// </summary>
        public static void Initialize( System.Windows.Forms.Control Parent )
        {
            if ( device1 != null )
            {
                device1.Dispose();
                device1 = null;
            }

            if ( device2 != null )
            {
                device2.Dispose();
                device2 = null;
            }

            foreach ( DeviceInstance instance in Manager.GetDevices( DeviceClass.GameControl,
                EnumDevicesFlags.AttachedOnly ) )
            {
                if ( device1 == null )
                    device1 = new Device( instance.InstanceGuid );
                else if ( device2 == null )
                    device2 = new Device( instance.InstanceGuid );
            }

            DisposeForces();
            P1Forces = new Dictionary<ForceType, EffectObject>();
            P2Forces = new Dictionary<ForceType, EffectObject>();

            InitializeDevice( Parent, device1 );
            InitializeDevice( Parent, device2 );
        }
        #endregion

        #region InitializeDevice
        private static void InitializeDevice( System.Windows.Forms.Control Parent, Device Dev )
        {
            if ( Dev == null )
                return;

            Dev.SetDataFormat( DeviceDataFormat.Joystick );
            Dev.SetCooperativeLevel( Parent, CooperativeLevelFlags.Background |
                CooperativeLevelFlags.Exclusive );
            Dev.Properties.AxisModeAbsolute = true;
            Dev.Properties.AutoCenter = false;
            Dev.Acquire();

            int[] axis = null;

            // Enumerate any axes
            foreach ( DeviceObjectInstance doi in Dev.Objects )
            {
                if ( ( doi.ObjectId & (int)DeviceObjectTypeFlags.Axis ) != 0 )
                {
                    // We found an axis, set the range to a max of 10,000
                    Dev.Properties.SetRange( ParameterHow.ById,
                        doi.ObjectId, new InputRange( -5000, 5000 ) );
                }

                int[] temp;

                // Get info about first two FF axii on the device
                if ( ( doi.Flags & (int)ObjectInstanceFlags.Actuator ) != 0 )
                {
                    if ( axis != null )
                    {
                        temp = new int[axis.Length + 1];
                        axis.CopyTo( temp, 0 );
                        axis = temp;
                    }
                    else
                    {
                        axis = new int[1];
                    }

                    // Store the offset of each axis.
                    axis[axis.Length - 1] = doi.Offset;
                    if ( axis.Length == 2 )
                    {
                        break;
                    }
                }
            }

            Dictionary<ForceType, EffectObject> forces;

            if ( Dev == device1 )
                forces = P1Forces;
            else
                forces = P2Forces;

            try
            {
                if ( axis != null )
                {
                    forces.Add( ForceType.VeryBriefJolt,
                        InitializeForce( Dev, EffectType.ConstantForce, axis,
                            6000, EffectFlags.ObjectOffsets | EffectFlags.Spherical, 150000 ) );
                    forces.Add( ForceType.BriefJolt,
                        InitializeForce( Dev, EffectType.ConstantForce, axis,
                            10000, EffectFlags.ObjectOffsets | EffectFlags.Spherical, 250000 ) );
                    forces.Add( ForceType.LowRumble,
                        InitializeForce( Dev, EffectType.ConstantForce, axis,
                            2000, EffectFlags.ObjectOffsets | EffectFlags.Cartesian, 900000 ) );
                    forces.Add( ForceType.HardRumble,
                        InitializeForce( Dev, EffectType.ConstantForce, axis,
                            10000, EffectFlags.ObjectOffsets | EffectFlags.Spherical, 2000000 ) );
                }
            }
            catch ( Exception e ) 
            {
                System.Windows.Forms.MessageBox.Show( "Could not initalize force feedback:\n\n" + e );
            }
        }
        #endregion

        #region DisposeForces
        public static void DisposeForces()
        {
            if ( P1Forces != null )
            {
                foreach ( EffectObject o in P1Forces.Values )
                    o.Dispose();
                P1Forces = null;
            }

            if ( P2Forces != null )
            {
                foreach ( EffectObject o in P2Forces.Values )
                    o.Dispose();
                P2Forces = null;
            }
        }
        #endregion

        #region SendForce
        public static void SendForce( ForceType Type, bool IsPlayer1 )
        {
            Dictionary<ForceType, EffectObject> forces;

            if ( IsPlayer1 )
                forces = P1Forces;
            else
                forces = P2Forces;

            if ( forces == null )
                return;
            if ( !forces.ContainsKey( Type ) )
                return;

            EffectObject force = forces[Type];
            force.Start( 1 );
        }
        #endregion

        #region InitializeForce
        public static EffectObject InitializeForce( Device Dev, EffectType Type,
            int[] Axis, int Magnitude, EffectFlags Flags, int Duration )
        {
            EffectObject eo = null;
            Effect e;

            foreach ( EffectInformation ei in Dev.GetEffects( EffectType.All ) )
            {
                if ( DInputHelper.GetTypeCode( ei.EffectType ) == (int)Type )
                {
                    e = new Effect();
                    e.SetDirection( new int[Axis.Length] );
                    e.SetAxes( new int[1] ); //this is the offending line in the Microsoft examples
                    //setting axes to 2 causes the dreaded "Value does not fall within expected range" error
                    //this is evidently a bug in Managed DirectX, at least affecting some game pads,
                    //and this is the only workaround I've found.
                    //I have not been able to successfully load FFE files in Managed DirectX
                    //due to this same problem (presumably, in the inner initialization code
                    //when loading from FFE, it is trying to load two axes there, as well).

                    //This problem exists with all verys of Managed DirectX, as far as I can tell,
                    //at least up through March 2008 when this example was written.

                    e.EffectType = Type;
                    e.ConditionStruct = new Condition[Axis.Length];
                    e.Duration = Duration;
                    e.Gain = 10000;
                    e.Constant = new ConstantForce();
                    e.Constant.Magnitude = Magnitude;
                    e.SamplePeriod = 0;
                    e.TriggerButton = (int)Microsoft.DirectX.DirectInput.Button.NoTrigger;
                    e.TriggerRepeatInterval = (int)DI.Infinite;
                    e.Flags = Flags;
                    e.UsesEnvelope = false;

                    // Create the effect, using the passed in guid.
                    eo = new EffectObject( ei.EffectGuid, e, Dev );
                }
            }

            return eo;
        }
        #endregion
    }
}
Reply With Quote
  #6  
Old 09-30-2009, 01:03 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default VB Translation

VB Translation

Code:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectInput

Namespace ForceFeedbackExample
    
    Public NotInheritable Class DirectInputWrapper
        #Region "ForceType"
        
        Public Enum ForceType
            VeryBriefJolt
            BriefJolt
            LowRumble
            HardRumble
        End Enum
        #End Region
        
        
        Private Shared device1 As Device
        Private Shared device2 As Device
        
        Private Shared P1Forces As Dictionary(Of ForceType, EffectObject)
        Private Shared P2Forces As Dictionary(Of ForceType, EffectObject)
        
        #Region "Initialize"
        
        Public Shared Sub Initialize(ByVal Parent As System.Windows.Forms.Control)
            If device1 IsNot Nothing Then
                device1.Dispose()
                device1 = Nothing
            End If
            
            If device2 IsNot Nothing Then
                device2.Dispose()
                device2 = Nothing
            End If
            
            For Each instance As DeviceInstance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)
                If device1 Is Nothing Then
                    device1 = New Device(instance.InstanceGuid)
                ElseIf device2 Is Nothing Then
                    device2 = New Device(instance.InstanceGuid)
                End If
            Next
            
            DisposeForces()
            P1Forces = New Dictionary(Of ForceType, EffectObject)()
            P2Forces = New Dictionary(Of ForceType, EffectObject)()
            
            InitializeDevice(Parent, device1)
            InitializeDevice(Parent, device2)
        End Sub
        #End Region
        
        #Region "InitializeDevice"
        Private Shared Sub InitializeDevice(ByVal Parent As System.Windows.Forms.Control, ByVal Dev As Device)
            If Dev Is Nothing Then
                Exit Sub
            End If
            
            Dev.SetDataFormat(DeviceDataFormat.Joystick)
            Dev.SetCooperativeLevel(Parent, CooperativeLevelFlags.Background Or CooperativeLevelFlags.Exclusive)
            Dev.Properties.AxisModeAbsolute = True
            Dev.Properties.AutoCenter = False
            Dev.Acquire()
            
            Dim axis As Integer() = Nothing
            
            ' Enumerate any axes
            For Each doi As DeviceObjectInstance In Dev.Objects
                If (doi.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) <> 0 Then
                    ' We found an axis, set the range to a max of 10,000
                    Dev.Properties.SetRange(ParameterHow.ById, doi.ObjectId, New InputRange(-5000, 5000))
                End If
                
                Dim temp As Integer()
                
                
                If (doi.Flags And CInt(ObjectInstanceFlags.Actuator)) <> 0 Then
                    If axis IsNot Nothing Then
                        temp = New Integer(axis.Length) {}
                        axis.CopyTo(temp, 0)
                        axis = temp
                    Else
                        axis = New Integer(0) {}
                    End If
                    
                    ' Store the offset of each axis.
                    axis(axis.Length - 1) = doi.Offset
                    If axis.Length = 2 Then
                        Exit For
                    End If
                End If
            Next
            
            Dim forces As Dictionary(Of ForceType, EffectObject)
            
            If Dev = device1 Then
                forces = P1Forces
            Else
                forces = P2Forces
            End If
            
            Try
                If axis IsNot Nothing Then
                    forces.Add(ForceType.VeryBriefJolt, InitializeForce(Dev, EffectType.ConstantForce, axis, 6000, EffectFlags.ObjectOffsets Or EffectFlags.Spherical, 150000))
                    forces.Add(ForceType.BriefJolt, InitializeForce(Dev, EffectType.ConstantForce, axis, 10000, EffectFlags.ObjectOffsets Or EffectFlags.Spherical, 250000))
                    forces.Add(ForceType.LowRumble, InitializeForce(Dev, EffectType.ConstantForce, axis, 2000, EffectFlags.ObjectOffsets Or EffectFlags.Cartesian, 900000))
                    forces.Add(ForceType.HardRumble, InitializeForce(Dev, EffectType.ConstantForce, axis, 10000, EffectFlags.ObjectOffsets Or EffectFlags.Spherical, 2000000))
                End If
            Catch e As Exception
                System.Windows.Forms.MessageBox.Show("Could not initalize force feedback:" & vbLf & vbLf & e)
            End Try
        End Sub
        #End Region
        
        #Region "DisposeForces"
        Public Shared Sub DisposeForces()
            If P1Forces IsNot Nothing Then
                For Each o As EffectObject In P1Forces.Values
                    o.Dispose()
                Next
                P1Forces = Nothing
            End If
            
            If P2Forces IsNot Nothing Then
                For Each o As EffectObject In P2Forces.Values
                    o.Dispose()
                Next
                P2Forces = Nothing
            End If
        End Sub
        #End Region
        
        #Region "SendForce"
        Public Shared Sub SendForce(ByVal Type As ForceType, ByVal IsPlayer1 As Boolean)
            Dim forces As Dictionary(Of ForceType, EffectObject)
            
            If IsPlayer1 Then
                forces = P1Forces
            Else
                forces = P2Forces
            End If
            
            If forces Is Nothing Then
                Exit Sub
            End If
            If Not forces.ContainsKey(Type) Then
                Exit Sub
            End If
            
            Dim force As EffectObject = forces(Type)
            force.Start(1)
        End Sub
        #End Region
        
        #Region "InitializeForce"
        Public Shared Function InitializeForce(ByVal Dev As Device, ByVal Type As EffectType, ByVal Axis As Integer(), ByVal Magnitude As Integer, ByVal Flags As EffectFlags, ByVal Duration As Integer) As EffectObject
            Dim eo As EffectObject = Nothing
            Dim e As Effect
            
            For Each ei As EffectInformation In Dev.GetEffects(EffectType.All)
                If DInputHelper.GetTypeCode(ei.EffectType) = CInt(Type) Then
                    e = New Effect()
                    e.SetDirection(New Integer(Axis.Length - 1) {})
                    e.SetAxes(New Integer(0) {})
                    
                    
                    e.EffectType = Type
                    e.ConditionStruct = New Condition(Axis.Length - 1) {}
                    e.Duration = Duration
                    e.Gain = 10000
                    e.Constant = New ConstantForce()
                    e.Constant.Magnitude = Magnitude
                    e.SamplePeriod = 0
                    e.TriggerButton = CInt(Microsoft.DirectX.DirectInput.Button.NoTrigger)
                    e.TriggerRepeatInterval = CInt(DI.Infinite)
                    e.Flags = Flags
                    e.UsesEnvelope = False
                    
                    
                    eo = New EffectObject(ei.EffectGuid, e, Dev)
                End If
            Next
            
            Return eo
        End Function
        #End Region
    End Class
End Namespace
Reply With Quote
  #7  
Old 09-30-2009, 05:04 PM
Qua's Avatar
QuaConverting between C# and VB.NET Qua is offline
Impetuous & volatile

* Expert *
 
Join Date: Apr 2005
Posts: 2,177
Default

So you succesfully translated the code?
__________________
Reading is the foundation for all knowledge - Unknown.
Reply With Quote
  #8  
Old 09-30-2009, 05:13 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default

I translated some of the basic bits but it took me a while to correct the bits I didn't translate properly so I used a translator for the more complex bits. Thank you for your first post, it really helped!

I'm trying to get it done quite quickly as there are other people waiting on me getting this code complete. If I had the time I would attempt to translate it all myself.

Do you know where each of the sections of code need to go in my project?

Thanks again =]
Reply With Quote
  #9  
Old 10-07-2009, 11:53 AM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default

Anyone got any ideas please?
Reply With Quote
  #10  
Old 10-07-2009, 01:19 PM
AtmaWeapon's Avatar
AtmaWeaponConverting between C# and VB.NET AtmaWeapon is offline
Fabulous Florist

Forum Leader
* Guru *
 
Join Date: Feb 2004
Location: Austin, TX
Posts: 9,500
Default

What do you mean by "where do each of the sections of code need to go in my project"? What is a "section of code"? I see one class and one namespace; those are the only two pieces I'd remotely consider a "section" and the answer is "in a file".

This is a very self-contained example that demonstrates sending a few forces to a joystick. It's not a library that abstracts force feedback away. If you really don't understand what this code does and how its pieces fit together, you aren't helping anyone by pasting it into your application and randomly calling in to it; it's only configured to use a few specific forces. It's up to you to look at the code, *understand* how it works, then write your own code that works with the joystick.
__________________
.NET Resources
My FAQ threads | Tutor's Corner | Code Library
I would bet money 2/3 of .NET questions are already answered in one of these three places.
Reply With Quote
  #11  
Old 10-07-2009, 02:08 PM
01chris 01chris is offline
Newcomer
 
Join Date: Sep 2009
Posts: 10
Default

Quote:
Originally Posted by AtmaWeapon View Post
What do you mean by "where do each of the sections of code need to go in my project"? What is a "section of code"? I see one class and one namespace; those are the only two pieces I'd remotely consider a "section" and the answer is "in a file".

This is a very self-contained example that demonstrates sending a few forces to a joystick. It's not a library that abstracts force feedback away. If you really don't understand what this code does and how its pieces fit together, you aren't helping anyone by pasting it into your application and randomly calling in to it; it's only configured to use a few specific forces. It's up to you to look at the code, *understand* how it works, then write your own code that works with the joystick.
I am a beginner with this sort of thing. The way I like to learn is using tutorials. Despite many days worth of searching I have found no tutorials on sending force feedback commands to a device in VB.NET.

When I can't find tutorials I like to find code that I know works and then play around with it and see what happens. This allows me to get my head round the structure and "*understand*" the code. My intention with this code was to get the example working and then play around with bits of it so I could see which parts serve which purpose. Once I felt confident with the code I was going to write what I needed for my project. I had no intention of copying the example code straight into my project for 2 reasons: 1) It doesn't do exactly what I want it to. And 2) There is no point in copying it straight into my project as I would learn nothing from it (plus I would be taking someone else's work and passing it off as my own).
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Forum Jump

Advertisement:





Free Publications
The ASP.NET 2.0 Anthology
101 Essential Tips, Tricks & Hacks - Free 156 Page Preview. Learn the most practical features and best approaches for ASP.NET.
subscribe
Programmers Heaven C# School Book -Free 338 Page eBook
The Programmers Heaven C# School book covers the .NET framework and the C# language.
subscribe
Build Your Own ASP.NET 3.5 Web Site Using C# & VB, 3rd Edition - Free 219 Page Preview!
This comprehensive step-by-step guide will help get your database-driven ASP.NET web site up and running in no time..
subscribe
Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET Converting between C# and VB.NET
Converting between C# and VB.NET
Converting between C# and VB.NET
 
Converting between C# and VB.NET
Converting between C# and VB.NET
 
-->