Political Rant – Blogger Blog Reopened


I’ve reopened my blogger blog so that I could post a political rant without putting this blog.  I’ll probably post some more, but I won’t give any further announcements of such.  If you care to read what I had to say, here’s the link.

author: Jeff Handley | posted @ Sunday, September 28, 2008 10:18 PM | Feedback (0)

Silverlight 2 Post Beta2 Gotcha - Layout Cycle Detected


Continuing my series of gotchas for Silverlight 2, I wanted to talk about a common error that people are seeing.  This error is something new that you might see when moving code from Beta 2 to the Release Candidate or later.  In Beta 2, if the layout engine detected a cycle, it didn't throw any errors; as I understand it, the layout was just aborted.  But with post Beta2 bits, an error is thrown.

The error you'll get will specify "Layout Cycle Detected" as the message.  This error message is very accurate--the layout engine detected a cycle within your layout; or another way to say it, you have an infinite loop in your layout.

The biggest culprit that leads to this error is code within the LayoutUpdated event handler.  If your LayoutUpdated event handler does anything to alter the layout of your control, then that will cause the LayoutUpdated event to fire again, and again, and again... :-)

Sometimes you need to have layout altering code within this event handler though, so what is one to do?

First, you should consider whether you really need the layout changes to occur on every call to LayoutUpdated.  Would it suffice to handle the Loaded event as well as the Application.Current.Host.Content.Resized event.  Between these two events, you'll get notified when the control is loaded into the visual tree, and you'll get notified any time the host is resized, which could cause you to need to change your layout again.  Scenarios like modal dialogs should fall into this category.

Second, if you really do need to use LayoutUpdated, you might just need to put some conditions around your layout changes.  For instance, if you are calculating a new width and height for your control, before you actually set the width and height, check to make sure the current values differ from what you calculated.  This will allow the first LayoutUpdated event to resize your control, which triggers another LayoutUpdated event, but that event will recognize that there's no work to do, and the cycle will end.

These same rules will apply when you're handling the SizeChanged event, or if you're doing any other overrides on the layout of your control.

Update: I posted this information on Silverlight Forums as well

author: Jeff Handley | posted @ Friday, September 26, 2008 9:46 AM | Feedback (1)

Silverlight 2 Post Beta2 Gotcha - ContentPresenter


As I'm sure you already know, a Release Candidate for Silverlight 2 was published.  ScottGu does an amazing job of covering a lot of information in his blog posts, and others like Mike Snow have also provided some excellent detail.  As they repeatedly told you, go check out the breaking changes document that lists all breaking changes from Beta2 to this release candidate.

If you have a Silverlight application that runs against Beta2, please take immediate action to get it moved (in a test environment) to the RC bits.  There were a bunch of breaking changes (all for the better) and some of them might adversely affect your applications.  Since there isn't a release date for Silverlight 2 yet, I would recommend working quickly to make sure you are ready whenever it is released.  It's impossible to estimate how long it will take to complete the migration, so if you put it off, you might find yourself with a broken application once the final release is put out.

With all of that said, there is one gotcha that I want to highlight for you tonight.  This one caused some trouble for me when porting an application from Beta 2 to the newer bits.  I'm talking about the base class change to ContentPresenter.  In Beta2, ContentPresenter derived from Control; in the new bits, it derives from FrameworkElement.  This might not sound impactful, but it really is.  For starters, here's the list of properties that are now removed from ContentPresenter because of this change:

  • Background
  • BorderBrush
  • BorderThickness
  • DefaultStyleKey
  • FontFamily
  • FontSize
  • FontStretch
  • FontStyle
  • FontWeight
  • Foreground
  • HorizontalContentAlignment
  • IsEnabled
  • IsTabStop
  • Padding
  • TabIndex
  • TabNavigation
  • Template
  • VerticalContentAlignment

That's a pretty long list!  And to make matters worse, I think that every single ContentPresenter I encountered in the app I ported was using at least half of these properties.  That meant that the XAML had to be updated so that these properties were set on a container control that included the ContentPresenter.  In some cases, that was straight-forward, but in others, it wasn't as simple.

Now, for the real kick in the pants... If you have some of these properties set on a ContentPresenter, within your XAML, your application will build just fine.  It might even run and begin to function.  But eventually, the parser will try to load this portion of the XAML and it will barf.  You will get really bizarre errors like this: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)).  The stack trace will look very scary and it will point you nowhere near your ContentPresenter.

In my experience, this caused some major headaches.  Sometimes the app would run, sometimes it wouldn't.  Sometimes all screens would work, sometimes they wouldn't.  When it did crash, it would crash with a different stack trace each time it seemed.  The common thread was the catastrophic failure E_UNEXPECTED, even though the rest of the stack trace would vary widely.

Since examining the stack traces eventually proved to be a fruitless effort, I started removing XAML one block at a time from all content in the application.  Ultimately, I found that one of the XAML files had some errors in it when opened in VS.  When I had the file open, I could see that there were errors reported about the bad properties on the ContentPresenter.  Once I got rid of all of the obsolete properties from all of the ContentPresenter controls in the entire app, it ran smoothly.  I then just had to restyle some things to restore the desired presentation.

So, if you have a Silverlight Beta2 application that you are porting to the RC (or final) build, beware of your ContentPresenter controls.  If you get strange and sporadic errors from anywhere in your application, don't assume the problems are near where the failure was.  Just open all of your XAML files in the editor and look for errors on your ContentPresenters.  Once you get rid of the obsolete properties, you will be in much better shape.

Now, go update your application to work against the release candidate!

Update: I posted this information to the Silverlight Forums as well
Another Update: Jesse Liberty posted about this topic to, upon my request for more coverage on the topic

author: Jeff Handley | posted @ Thursday, September 25, 2008 11:37 PM | Feedback (0)

Items in the News that Caught my Attention


This article has nothing to do with technology, at all.  Just me talking about a couple of things in the news that have caught my attention.

Our Biased Media

I saw a headline on CNN the other day, "McCain adviser Fiorina: Palin not ready to run a corporation."  The headline is a blatant slam against Palin, which of course is not unusual.  Now, I don't think Palin is infallible, but she does seem to be getting a biased amount of subjective criticism from the press.  I read the article though, to see what it was about, and by the time I got done reading it, I felt sick to my stomach.  Here's why...

The article starts off with this:

Carly Fiorina, the former Hewlett-Packard CEO turned top John McCain aide, said she doesn't think Sarah Palin is qualified to run a major corporation. For that matter, Fiorina said, McCain, Obama and Biden aren't capable of that kind of job either.

So in actuality, Fiorina didn't say that Palin isn't ready to run a corporation, but rather she said that none of the 4 candidates on the major presidential ballots are ready.  Why didn't the headline read, "McCain adviser Fiorina: None of these candidates are ready to run a corporation?"  I'll tell you why; for the same reason that Us Weekly ran their famous cover about Palin.  This is completely despicable.

Reading the full article is what made me sick though.  Even though Fiorina said that none of the candidates is ready, the entire article talked about how McCain and Palin aren't ready.  In fact, the article quotes the democratic campaign:

If John McCain's top economic adviser doesn't think he can run a corporation, how on Earth can he run the largest economy in the world in the midst of a financial crisis?" said Obama spokesman Tommy Vietor. "Apparently, even the people who run his campaign agree that the economy is an issue John McCain doesn't understand as well as he should."

Yeah, there's the slight mention of Obama not being ready, or Biden, but that's at the beginning of the article, and then the rest just bashes the republican ticket.  By the end, all you remember is that McCain and Palin aren't ready, and you don't recall that Obama and Biden aren't ready either.  This slant just makes me sick.

What's going on with air travel?

"They" always say that traveling by plane is the safest way to travel.  And I remember hearing and reading about very long spans of time between plane crashes.  But man, recently, it's been crazy-bad.  It seems like every day there is another report of a deadly plane crash.  Something's going on it seems, because there just shouldn't be this many plane crashes.

Tonight, I saw another report.  There was a missing plane the other day.  There was the Spanair crash that killed 154.  There was the Russian crash that killed 88.  And many more.  I started to notice the trend on July 25, when a plane had a huge chunk break off during flight.  My mother-in-law was actually here at that time, and she's had some bad flights before, so I didn't say anything, since she would be flying back home a week later.  But I started to take note of the repeated reports of plane problems and crashes.

I ended up finding www.planecrashinfo.com and their Recent Accidents page.  It's scary to look at all of the recent problems, with a bunch of problems since June.  Then tonight, I found the Aviation Safety site and their list is a bit more comprehensive.  Check out the list and look at how many problems there have been since June.  It's hard to not get anxious about flying back to Ohio for Christmas.

author: Jeff Handley | posted @ Saturday, September 20, 2008 10:11 PM | Feedback (0)

Custom Controls Everywhere and ASP.NET MVC, part 3


Disclaimer: This article and the ideas presented are based on 7-month-old thoughts that have been undeveloped.  While I expect the ideals disclosed are still valid, they might be totally off-base.  I wanted to finish writing this series and share my thoughts, but I've been unable to keep up with the ASP.NET MVC framework.  Please check here for more information.

Another Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.  I am not involved in the ASP.NET MVC project.

This article discusses how I think the ASP.NET MVC framework could be changed to offer better extensibility and customization.  With that said, I think ASP.NET MVC is one of the most extensible frameworks offered by Microsoft.  Its extensibility has been praised, unlike most other stuff that comes out of Microsoft.  But I think one aspect of the framework has been unintentionally locked down from extensibility and customization--the actual HTML rendering of "controls."

Setting Context

When I talk about "controls" in this context, I'm not talking about WebForms controls or 3rd party controls like the Infragistics stuff, rather I'm talking about primitive HTML tags like <input> and <select>.  Many of these tags/controls are emitted through the HTML Helpers library, a set of extension methods such as Html.TextBox().  This is where customization and extensibility are taken away.  I discussed this in part 1 of this series.  I think a different approach should have been taken to roll up common controls into shortcuts.

What I Would Have Done

Part 2 of this series showed how I would implement Custom Controls Everywhere in ASP.NET MVC; essentially, I think that approach should have been promoted in ASP.NET MVC.  Instead of creating an exhaustive library of extension methods that are overloaded like mad, accepting 'object' parameters for anonymous types, fully typed classes should have been created for the different controls.  Instead of having overloaded Html.TextBox() methods, there should be a TextBox class with properties to replace the parameters of the method.  Then, as I demonstrated, the ToString() method on the TextBox class can be responsible for translating the class with its properties into an HTML tag.

My approach also resulted in a base class for MvcControl that handled the raw HTML tag and attributes, allowing a TextBox class to simply define its HTML tag, its properties and how they map to HTML attributes.  This is extremely extensible, because I can create new controls very quickly and easily while still using the shortcut to simply the actual rendering.  With the extension method approach of the HTML Helpers, every extension method is responsible for rendering the HTML, and I suspect there's a lot of duplication going on across the methods and the overloads.

With the TextBox class approach, intellisense is superior to that of the extension methods.  Instead of named parameters into overloads, you can use object initializers and see all possible properties available for the control.  This was illustrated in Part 2 with the following screen shot.

Why (I Think) My Approach is More Extensible and Customizable

Extensibility and customization is improved with my approach because I can easily add additional behavior to the TextBox by simply deriving from it and adding new properties and optionally overriding ToString().  This still gives you 100% control over how the HTML is rendered, unlike ASP.NET WebForms custom controls, but it offers the rich customizations of WebForms unlike MVC's HTML Helpers.  See, with the HTML Helpers, if I need to slightly tweak the output of an extension method, I cannot derive from it and do so, I must create my own extension methods.  Considering the number of overloads involved in this, in can get completely out of control.

Composition Over Inheritance

Having a custom MvcControl class would probably be frowned upon by many.  I was actually just talking with Glenn Block yesterday and he talked about how pattern folks often prefer composition over inheritance.  With that in mind, the custom controls approach can be tweaked slightly to work in a composition mode.  Instead of having a base class, we could easily have a service class that would accept an object, a map of property name to attribute name, and a tag name, and return an HTML tag string.  This service would be called from within the TextBox ToString() method.  This approach would require a little more code in each control, but you would be free to have your own inheritance hierarchy without having to keep MvcControl at the root.  I think the best approach would be to combine the inheritance and composition approaches, offering both by having a static method on MvcControl such as ConvertObjectToTag(object, tagName, propertyAttributeMap).  The ToString() method on MvcControl would use this method itself as well, ensuring consistent results regardless of the approach used.

What ASP.NET MVC Could Change

To make my suggestions more concrete, here's a summary of what I would have done differently.  Instead of creating a huge library of extension methods, I would have created classes for the different controls.  This would have been close but not equal to a 1:1 ratio of control to HTML Tag; there'd be slightly more "controls" than HTML tags, since there are cases where 2 or more logical controls map to the same HTML tag.  ListBox and DropDownList are a simple example, where both map to a <select> tag.  Where the extension methods have been overloaded, the classes would have simply had properties added to them, with some occasional conditional logic in the overridden ToString() method.

But ya know what else I would have done?  I would have made the VS templates include a folder chock full of classes, one for each control.  These classes would have derived from the provided control classes, stubbing out the place for you to add your own extensions and customizations to the controls.  Even though it's cheap to create these on your own, it's not encouraged enough.  By stubbing the custom controls out for you, the entrance barrier is torn down and you are shown exactly how and where to manipulate the HTML output of these controls.  The templates would be set up so that your controls would be used in your views rather than those that ship with the framework.  And to really drive the point home, the framework controls could be marked as abstract, forcing you to use your custom controls everywhere, guiding you into the pit of success.

Closing Statements

For what it's worth, there's nothing in ASP.NET MVC that prevents this approach from being used; nothing at all.  But what's frustrating is that in order to use this, you have to completely ignore all of the hard work that was put into the HTML Helpers library.  There's a ton of sugar in there that you won't get to benefit from.  If the methods had been build with my approach, you could completely customize your controls where needed, but utilize the default behaviors where that's all you need.

I do wish I had had time to explore these ideas earlier this year, with the opportunity to perhaps build out some of the classes and templates I'm suggesting.  But such is life.  Maybe someone else that supports my ideas here can run with it and add it to the MvcContrib project or something.  Regardless, I am glad to have finally documented my thoughts on this and I hope that some of you find this valuable.

author: Jeff Handley | posted @ Saturday, September 20, 2008 6:10 PM | Feedback (0)

IF in Batch Files


Yes, I still write batch files.  Sue me.*

Here’s one version of my IF statement:

   1: SET ProgRoot=%ProgramFiles%
   2:  
   3: IF NOT "%ProgramFiles(x86)%" == "" (
   4:     SET ProgRoot=%ProgramFiles(x86)%
   5: )
   6:  
   7: ECHO %ProgRoot%

This will output:
C:\Program Files (x86

Yes, it’s missing the closing parenthesis.

Here’s another version:

   1: SET ProgRoot=%ProgramFiles%
   2:  
   3: IF NOT "%ProgramFiles(x86)%" == "" SET ProgRoot=%ProgramFiles(x86)%
   4:  
   5: ECHO %ProgRoot%

And it will output:
C:\Program Files (x86)

That version is correct.

Technorati Tags: ,

 

* Actually, please don’t sue me!

author: Jeff Handley | posted @ Wednesday, September 10, 2008 4:38 PM | Feedback (0)

Custom Controls Everywhere and ASP.NET MVC, incomplete


I appreciate all of the interest in this article series and I apologize that I've not finished it yet.  I'd like to offer my excuse, although you might not see it as a valid one.  And I'll share my plans for completing the article series.

When I started writing this series of articles, I was examining ASP.NET MVC for use on my current project.  I was also about to interview at Microsoft, for what I thought could be a position on the ASP.NET MVC team.  With that combination, it was important that I get pretty familiar with what the team was offering, and prepare myself to be immerged in it, whether I would be working WITH it or ON it.  In fact, I wrote Part 1 while I was sitting in a hotel room in Redmond the day before I interviewed with Microsoft.

As it turned out, I did well in my interviews and Microsoft offered me a job, but not with the ASP.NET team.  Life got to be pretty hectic for me, and I didn't get to finish the series before I moved across the country and started my new job.

Shortly after joining Microsoft, I actually exchanged a couple of emails with Rob Conery, and I talked with Phil Haack.  While neither of them shot down what I was saying, but they didn't exactly embrace it either.  Rob suggested that I take a look at his Storefront series, which would help me see the light as far as what MVC has to offer, and why custom controls everywhere doesn't exactly fit.  Since then, I've fallen out of touch with what the ASP.NET MVC team is shipping and I didn't feel right about posting parts 3 and 4 without getting up to speed on the newer developments.

Procrastination has snowballed as it always does though.  I've not yet watched the Storefront series, and it's progressed so much now that I don't foresee getting time to get caught up.  I am not evaluating ASP.NET MVC as part of my job anymore either, so that makes it especially difficult to keep up with it--and they've put out a ton of new stuff since I last saw it.

I don't want to leave you hanging though, so I want to finish the series, but with a huge disclaimer... I'll merely be posting undeveloped thoughts from more than 6 months ago.  I won't have working code and what I talk about might be completely obsolete based on the newer releases of ASP.NET MVC.  But maybe it won't be stale and it will still be helpful, who knows?  So when I do post, I hope that those of you who have kept up with ASP.NET MVC will set the record straight as necessary.

Update: See Part 3.

author: Jeff Handley | posted @ Sunday, September 07, 2008 1:28 AM | Feedback (0)

Custom Controls Everywhere is Cheap!


I've noticed that I get quite a bit of traffic on my blog for my "Custom Controls Everywhere" posts.  This page in particular has driven a bunch of people to Custom Controls Everywhere and ASP.NET MVC, Part 0.  The response to the link is actually consistent with a question I've gotten a couple of times in email and in person too.  In fact, it's also the gut reaction whenever I tell someone to use custom controls everywhere--something alluding to it costing too much.

I think what I've failed to lay out with my custom controls everywhere sermon is that it's cheap.  Heck, it's almost free.  With VS 2008's Intellisense support, it's really dang easy.

Whenever I create a new ASP.NET (WebForms) application, or a WinForms application, the first thing I do, before writing any app code, is create a new Page/Form base class, and then custom controls for Textbox, DropDownList/ComboBox, Checkbox, RadioButton, Button, etc., whatever I know I'm going to use.

Here's some example code for this:

   1: using System;
   2:  
   3: namespace CustomControlsEverywhere
   4: {
   5:     public class Page : System.Web.UI.Page
   6:     {
   7:     }
   8: }
   1: using System;
   2:  
   3: namespace CustomControlsEverywhere.Controls
   4: {
   5:     public class TextBox : System.Web.UI.WebControls.TextBox
   6:     {
   7:         public new CustomControlsEverywhere.Page Page
   8:         {
   9:             get
  10:             {
  11:                 return base.Page as CustomControlsEverywhere.Page;
  12:             }
  13:         }
  14:     }
  15: }


With that, I have a custom Page base class and a custom TextBox.  Repeat the TextBox code for all controls expected to be used, and you have created "Custom Controls Everywhere."

Using the custom page base class and the custom textbox is easy too.  Here's how to make your Default.aspx use your own Page base class:

   1: public partial class _Default : CustomControlsEverywhere.Page


Then in order to use your TextBox, the ASPX markup looks like this:

   1: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CustomControlsEverywhere._Default" %>
   2: <%@ Register TagPrefix="Controls" Namespace="CustomControlsEverywhere.Controls" Assembly="CustomControlsEverywhere" %>
   3:  
   4: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   5:  
   6: <html xmlns="http://www.w3.org/1999/xhtml" >
   7: <head runat="server">
   8:     <title></title>
   9: </head>
  10: <body>
  11:     <form id="form1" runat="server">
  12:     <div>
  13:         <Controls:TextBox runat="server" />
  14:     </div>
  15:     </form>
  16: </body>
  17: </html>


The important line is the <%@ Register ... %> where we register the "Controls" namespace.  Feel free to make this whatever you want, I just used Controls for illustration.

CustomControlsEverywhere-IntellisenseInASPX What's great is that after you build your solution, and wait a few seconds for Intellisense to catch up, you get the same help with your custom controls that you get with the stock controls.

One of the common pitfalls is namespace collisions.  If you stick with TextBox, DropDownList, Button, etc. for your custom control names, you'll run into collisions within your code-behind.  But since your control has the stock control as its base class, this often doesn't matter--it only comes into play when you try to access a new property or method on your control that the stock control doesn't have.  But this situation is very manageable and it doesn't take long to get used to it.

As you can see, when you're creating a new project, it is very easy and cheap to create custom controls everywhere.  Where it does get difficult and expensive is when you have hundreds of existing screens referencing stock controls and you need to implement a custom control.  And that is exactly why I preach "Custom Controls Everywhere" in the first place--if you start off this way, you won't regret it, but if you start with the stock controls, you very well might regret that.

author: Jeff Handley | posted @ Sunday, September 07, 2008 12:56 AM | Feedback (0)

Being forced into retirement


Over the course of my career, I've had many projects get forced into retirement, for many different reasons.  During my years of self-employment, we created sites and applications for lots of small businesses.  I learned during this time that small businesses are very volatile and our hard work on an application might never pay off because the business might fail regardless of its software (and we might not even get paid).  But I also built a system for large company and the division was sold off; the software ultimately became useless.  When building systems to run businesses, the software is never immune to forced retirement.

This year marks the retirement of another system I helped to build--Statsworld.com.  When I joined BIG back in 2003, Statsworld was the first project I was assigned to.  I worked with Jess Tedder and the owners of BIG, and we "ported" a thick-client program BIG had been running for many years over to the web.  We used ASP.NET and built a terrific system.  Statsworld had an excellent reputation in the industry even though the site was never advertised; we only gained customers through word of mouth, but we got quite a few of them.  Now, 5 years later, Statsworld has been retired, merging with MyFantasyLeague.com.

I wasn't much of a football fan when I started working on Statsworld.  Ironically, neither was Jess; there we were, the two of us, building this fantasy football application, and we'd often have to ask questions about whether a certain position was on offense or defense.  I remember when I was working on the "Sports Page" feature of Statsworld, creating generated game summaries, and I was asked to make the screen look like a newspaper's sports page.  I had to go buy a paper so that I could see what a sports page looked like; the bosses thought that was hilarious.

After a very short development cycle, we launched Statsworld July 1, 2003--right on schedule.  If we'd missed our deadline by much, we could have missed out on the entire football season, but we hit it and as soon as we launched, we had customers signing up (and paying money).  It was a great feeling.  Inevitably, I got interested in fantasy football, and football in general.  I thoroughly enjoyed playing in our in-house leagues the seasons of 03-04 thought 07-08.  Statsworld often saw over a million page views on Sundays while tens of thousands of league members watched their scores real-time.  The system was a huge success, and it went years without any developers being assigned to it--it was incredibly stable.  I'm very proud of what we built, and it was exciting to be at BIG and watch the continued success of the product I helped to build.

When I resigned from BIG earlier this year to join Microsoft, I actually wondered to myself whether or not I'd play fantasy football this fall.  I was leaning toward not playing, because it's just another time-sucker that I didn't want to get into.  And it wouldn't be the same not being in the office to talk trash on Monday and Tuesday mornings.  We used to load up the game summaries (that I engineered) and laugh about the auto-generated quotes, such as "It's Official: Deadly Vipers have no backbone!"  When I was asked a couple of months ago if I wanted in the league, I said I didn't think so, but I went out to the Statsworld.com site for grins and giggles, only to find the announcement of the merger.  That solidified my "no" answer.

So for me, it's somewhat fitting that Statsworld has been retired, since I've also left BIG.  But at the same time, it's yet another "child" of mine that I don't get to watch grow up.  Sometimes it feels like I've had too many awesome projects get forced into retirement.  In the end, I don't feel badly about this one though, because I think it was actually for the best.  And I hope that by joining Microsoft, I'll get to see my work be much more long-lived.

author: Jeff Handley | posted @ Sunday, September 07, 2008 12:24 AM | Feedback (3)

Installing VS 2008 SP1 and I’m bored


Before leaving last night, I uninstalled all of the appropriate bits, and then fired off the installation for VS 2008 SP1.  I had heard it took a couple of hours, so I wanted to let it do its work while I was gone.

This morning, I arrived to find that the installation had paused, waiting for me to close down Word, Outlook and Internet Explorer.  So now I’ve closed those apps down and resumed the installation.

So, when I cannot use Office or IE, what should I be doing?  I don’t have Firefox installed, so I cannot even browse with that.

Before I closed IE, I saw that Ayende has already posted a Connect bug for SP1.  I’ll tell you what, it seems like he should be a Beta tester for every release and service pack—he always seems to find a way to break something!

Technorati Tags:

author: Jeff Handley | posted @ Wednesday, August 13, 2008 10:28 AM | Feedback (0)