Category Archives: .NET

Changing Roles

This week, I made the transition to a new team within my company.  It’s good to make a change every once in a while so that things don’t get stale.  I’ve heard it said that, as soon as you are so comfortable in your current role that you’re afraid to make a change – that’s when it’s time to try something new. 🙂

My new role is a bit more technical than my last and will give me more time to dig deeper into the latest .NET technologies out there.  I’m also going to be doing a bit more TFS administration. I’m looking forward to seeing how TFS works “under the hood” and be able to play around with all the cool new ALM features that are getting baked into the product.

I know I’ve been pretty lackadaisical lately with my posts.  To tell you the truth, I just wasn’t getting a lot of time to play with the tools, technologies and practices that this blog is all about, and I just didn’t have anything noteworthy to write about. With this new role change, I expect that will change.

Most of you have visited this blog for TFS-related content. Look for more of that (and other topics) to come!

Certified Again

Last year, I mentioned passing my first Microsoft certification exam to get certified in the .NET 3.5 Framework (exam 70-536). Earlier this month, I took one step closer to getting my web development MCPD by passing – nay, acing – exam 70-562.  And with this exam completed, I can now create a fancy little logo for my accomplishment.  (It’s the little things…):

MCTS ASP.NET 3.5 Framework Certified

With any luck, I’ll have the third exam under my belt in the next month and be done with it… until it’s time to upgrade.

TFS API: How to Get a Specific Version Programmatically

Within the Visual Studio Source Control Explorer, there are a number of options available for getting files out of TFS. Often times, developers just want to get the latest code to work with. But in some scenarios, developers need to get source files based on alternate criteria, such as by a specific date or label.  TFS provides a handful of options for selecting source files easily within the “Get Specific Version” dialog.

TFS: Get Specific Version Options

This works really well within Visual Studio, but how can you do this programmatically?  As it turns out, the Workspace.Get() method has an overloaded method that takes a VersionSpec argument.  Notice that VersionSpec is actually a base class. and that there are several inherited classes that can be used to specify the changeset type, including:

  • ChangesetVersionSpec
  • DateVersionSpec
  • LabelVersionSpec
  • LatestVersionSpec (equivalent to VersionSpec.Latest)
  • WorkspaceVersionSpec

For example, if you wanted to perform a GET on a specific changeset, you would simply pass an instance of ChangesetVersionSpec:

'connect to source control and get reference to existing workspace
Dim server As TfsTeamProjectCollection = _
   TfsTeamProjectCollectionFactory.GetTeamProjectCollection("http://myTfsServer:8080")
Dim vcs As VersionControlServer = _
   server.GetService(Of VersionControlServer)()
Dim ws As Workspace = vcs.GetWorkspace("MyExistingWorkspace", My.User.Name)

'Perform a GET on Changeset 100
Dim version As New ChangesetVersionSpec(100)
ws.Get(version, GetOptions.GetAll)

Performing a GET based on a pre-defined label works in much the same way (just replace the ChangesetVersionSpec object with a LabelVersionSpec object):

'connect to source control and get reference to existing workspace
' (same as above)...

'Perform a GET on items defined by label "My Label"
Dim version As New LabelVersionSpec("My Label")
ws.Get(version, GetOptions.GetAll)

Updated 2/28/2012: Revised code sample for TFS 2010 API.

Microsoft Windows and ASP.NET Tutorial Sites

I’ve been a fan of the Microsoft’s ASP.NET site for a while now.  If you’re not familiar with it, the site contains an awesome amount of information and resources for ASP.NET developers.  One of my favorite features of this site is the Learning section, which contains a large number of tutorial videos covering a range of different technologies, tools and controls within the realm of ASP.NET development.  While the videos are not usually in-depth on any single topic, they do provide great introductory examples to help me get past a lot of my initial hurdles and start developing something to cater to my specific needs.

Today, I came across theWindows Forms and WPF equivalent of the ASP.NET site, and I was amazed that I hadn’t thought to look sooner.  This site has the same great information and resources I was used to seeing for ASP.NET.  And this site also has a large number of video tutorials, both catering to the traditional Windows Forms developers as well as those moving into the WPF space.

This site has already made its way onto my list of useful work resources.  Today’s video was a review on how to use the BackgroundWorker class to simplify multi-threading.

TFS API: Check if Server Path Exists

Disclaimer:  Rarely do I get a chance to totally geek out and write a post specifically about code.  I enjoy the change-up.  And hopefully some of you will benefit from this.

Ok.  On a recent project, I’ve been playing around with the .NET APIs that were made available for interacting with TFS. You can tell that the documentation for these API’s are a little more raw than what is available for the .NET framework components, but that is not to say they aren’t still helpful.

As part of my project, I needed to programmatically download files to the local machine from version control.  As part of my unit testing, I wanted to validate the source path before attempting the download.  Basically, I wanted the equivalent of the System.IO.Directory.Exists() method in the .NET framework, but that validates against version control.

After several minutes of searching, I found the VersionControlServer.ServerItemExists() method. This handy method basically combines the functionality of the File.Exists() and Directory.Exists() methods, switching between the two (or combining) by setting the custom ItemType enumeration.

Using this method, I can first validate the path, as the following example shows:

Dim fakePath As String = "$/MyFakeTeamProject/RoadToNowhere"
Dim vcServer As VersionControlServer = Nothing

'...initialize a reference to the version control server here...

'Perform validation against server path before downloading.
' This example works for both file or directory paths.
If Not vcServer.ServerItemExists(fakePath, ItemType.Any) Then
   Throw New Exception("Hey! The path you gave me is bunk!")
End If

…and for the C# folks:

string fakePath = "$/MyFakeTeamProject/RoadToNowhere";
VersionControlServer vcServer = null;

//...initialize a reference to the version control server here...

// Perform validation against server path before downloading.
//  This example works for both file or directory paths.
if (!vcServer.ServerItemExists(fakePath, ItemType.Any))
{
   throw new Exception("Hey! The path you gave me is bunk!");
}