Offline Editing With TFS Integrated Source Control

I am a big fan of TFS. I have been using it for a while both at work and through codeplex. I have used several other source control systems including CVS, SVN, VSS and Star Team. I can say without equivocation that TFS is the best hands down, my second favorite is SVN which is a really great source control system as well.

Up until today there was two areas where I would say that SVN beats TFS and makes it worth using. The first is price; SVN is free while TFS is expensive, so it depends on your budget and your need for quality. If you are working on a public project you might as well go with codeplex because you’ll get a great source control system for free along with wiki pages, forums and issues management.

The second area is the ability to work on your project offline. SVN is perfectly designed with this concept in mind, you edit offline to your hearts content then the next time you’re online you fetch and merge everything and then check it in. Very simple but with TFS, since you’re integrated, once you are offline you loose the ability to keep track of what items you’re checking out and working on then the next time you go back online you end up needing to checkout stuff as a guess and it will also cause your integrated source control settings to get messed up it is very kludgy and annoying.

Well today I ran into a bug in TFS integrated source control and looked it up on the MSDN forums to see what the answer was. I had a situation where everytime I opened my TFS bound project it would be offline and I would have to rebind to the source control server every single time. Verrry annoying. Well after reading on the forums I found out that integrated projects actually have an “offline” mode built in and by right clicking on an offline solution node in the solution explorer tree you can select the “Go Online” command which will reconnect you to the server. What’s cool is that it actually keeps track of your offline edits, adds and deletes and will prompt you to check out the items when you go online! This is really cool, it effectively solves the offline problem of TFS integrated source control. Now I’d say SVN only has one advantage.

Of course in Visual Studio 2008 pre SP1 there is a bug here, and if I had some feedback for the TFS team I would reccommend that they either automatically “Go Online” when a bound solution is opened and the machine is connected or have some sort of icon somewhere to attract attention to the fact that this feature even exists. I have a feeling it’s been there for a while but I simply didn’t know about it. Maybe give the solution node a “disconnected” icon? Maybe keep all of the regular source control icons still? Something here is a little unintuitive.

So the tip of the day is if you’re working on your laptop with a TFS project and you suddenly go offline, don’t worry! Next time you’re online just right click your solution and select “Go Online” and you’re back in business.

WPF and MVC

Today I spent some time looking at how to organize my WPF application to use a Model View Controller design pattern. I ended up getting it to work fairly well but I am pretty dissapointed in the lack of support for this model directly.

Specifically I got hung up on the limitations around the ObjectDataProvider class. This is a DataSourceProvider object you can use to bind your controls against. You have two options with this data provider, you either specify an ObjectType or an ObjectInstance. If you specify the ObjectType then you end up with complete design time support for databinding against this provider, which is a wonderful thing in Blend 2. However, if you do this then the ObjectDataProvider will take it upon itself to create your instance based on the Type information you provided… which does not work if you want to specify an interface or an abstract class. Using the ObjectInstance approach will also give you design time support if you’re the instance you provide is also declared  in Xaml but this has the same activation limitations as simply specifying the Type. So this is a huge problem for an MVC style application.

What I really wanted to do was to create interfaces for all of my Modelsobjects, such as IProduct and IPurchase. Then I could create some mock objects for my test environment and let the other developer create the real objects for the real application. Well how the heck do you use the ObjectDataProvider so that it’s possible to bind against an abstract Model, the real instance of which is created by the controller? I think the answer is that you cannot, well not without sacrificing design time databinding support at least.

After looking at it for a while I realized that if I set IsInitialLoadEnabled property of my ObjectDataSource to false then after the controller is set in my form I could set the ObjectInstance field to my Model provided by the controller, then call InitialLoad. This would work but no design time support 😦

You’d think that you could specify the ObjectType for design time support then, using the initial load disabled trick create the real object but you would be wrong. Doing this throws an exception, you cannot set both fields for some inexplicable reason. The next thing you’d think of would be to inherit from ObjectDataProvider, override a method that creates the instance and instead create an event such as LoadInstance so that your controller can pass in the instance instead… but once again you’d be wrong. It seems that the ObjectDataProvider does not really expose any virtual methods of much use.

My next thought is to try to create an MvcDataProvider that supports this functionality a little better. I’m a little hesitant to do this though because of the difficulties I’ve had in the past creating a DataSource for ASP.NET. What a nightmare that was, even a very simple one.

Other than this one problem (which I’m hoping is just an ignorance problem still) I have to say I am enjoying using WPF immensely. Maybe creating a new DataSourceProvider will be just as easy and intuitive as the rest of WPF.

If anybody has any insight on how to resolve this issue I’d love to hear it. If I end up creating an MvcDataProvider I’ll be sure to post it in another blog.

AppDomain TransparentProxy Objects of Different Type

I have a very perplexing situation related to AppDomains. I am trying to create a new AppDomain (so I can load arbitrary assemblies and unload them again) but I am unable to cast returned objects to Types that I am able to use.

Specifically I have an object of Type EntityField[] being returned. If I set it to an object I can see that the Type is correct by calling GetType() in the watch window however whenever I cast it from an object to a strongly typed array I get a null value. Here is a little debugger screen shot.

I believe what is happening is that my assembly is being loaded into both AppDomains. So, while the objects are able to correctly identify themselves as the correct types it seems that the runtime is interpretting them as different types, despite the fact that they’re coming from the exact same Assembly (even the same file path).

What is the solution to this problem?? Should I not be loading the assembly into both domains? It seems to do this automatically when I try to create the proxy instance. One interesting thing to note is that I had to add an event handler for AppDomain.Current.AssemblyResolve, which I then loop through the local assemblies and return the one who’s fullname matches the args.FullName. Is there a more correct way to resolve assemblies? Why is it not resolved automatically, without any help, to begin with?

If anybody knows I’d greatly appreciate some help figuring this out.

As a side note, I’d like to offically vote for the ability to unload assemblies from the current AppDomain. That would be a nice feature.

line keyword in CSharp

I was working on some WPF code today and ended up looking in the partial class generated for a UserControl I was working on. The code it was generating was very strange and littered throughout it were some #line statements. So I headed over to the #line MSDN article to see what it was all about. It turns out it is a way for you to tell the compiler, directly in your code, to pretend that a particular line of code is actually from somewhere else. You can also “hide” code from the debugger apparently.

From what I understand this is only useful for compile time errors, and even then probably only useful for code generation. I’m pretty excited about this though because it will really be useful for generating code in NBusiness. In this way if I generate a property (for example) based on a field declared in an entity I can add a #line statement to redirect any errors that come up back to the entity field rather than some murky, generated, partial class that no one want’s to look through.

Beyond uses for code generation I really have a hard time coming up with a practical reason why it would be used… but it seems like it could be a really fun way to obfuscate code and make your coworkers life a living hell. Maybe if you don’t like a particular piece of code they wrote in, say, GiantComponenent.cs just add a snippet to one of your classes such as:

#line 1 "GiantComponent.cs"
)()F@#K@N3fkn

 

Now just head over to their desk and complain about some compile error you’re running into in their code.

Well I guess it’s true that you learn something new everyday.

Lang.NET 2008 Wrap Up

I’ve recently returned from a trip to Redmond. I was at the Lang.NET conference sponsored by Microsoft. Overall it was great. Microsoft took care of us like royalty and the people and conversations were incredible. With all the big brains around I felt even more retarded than normal, I was definitely an amateur compared to a lot of the people who were attending. The only thing that was unfortunate was that I managed to get a cold just before going out there, which was mild at first, but caused me to miss out on a lot of the free beer supplied (and lots of breweries I haven’t had a chance to try out yet too!) as well as miss the 3rd day entirely! I was really looking forward to seeing the VSX presentation and get a chance to talk to someone about NBusiness and get some integration questions I have been kicking around answered. Also, based on the description of Don Box’s speech I’m really sad to have missed that.

I met a guy there named Ted Neward. He was going to hook me up with a chance to meet with Ken Levy to talk about VS integration. I had to miss it because I was too sick and had completely lost my voice but I have his email address and will probably be sending him an email with a few questions and ideas.
 
Besides Jason Bock and I there were at least two other people from Minneapolis, Wez Furlong from the PHP group as well as Charles Nutter who works on JRuby for Sun. There was another guy there from Sun named John Rose who had a lot of interesting things to say about the similarities between Java and .NET and also knew a lot about creating programming languages. He talked about a lot of interesting things with me at the Rock Bottom brewery. It’s really encouraging to see that it’s possible to collaborate and discuss topics such as programming languages even between competitors. It seems that programming languages might just unite nerds more than divide them after all.
Overall I’d say that this symposium really revealed an intense focus towards dynamic languages right now. Perhaps it’s just the language enthusiasts who are the most interested in dynamic languages. This was an overwhelming focal point for this event. It’s all very cool stuff and I’m completely sold on the idea of using a dynamic language for developing unit tests first then writing your application. I’m not completely sold on the idea of a dynamic language everywhere however. It seems like it’s perfect for the top tier of an application, where things change the most and need to be the most flexible, but the lower you go a nice strongly typed library with strict encapsulation is probably preferable.
I was able to see Anders Hejlsberg (C#), Jim Hugunin (Iron Ruby and the DLR), Erik Meijer and many others speak. The videos should be on Channel 9 any day now. Here is a channel9 interview that took place with some of the speakers called Erik Meijer, Gilad Bracha, Mads Torgersen: Perspectives on Programming Language Design and Evolution but this was not one of the actual presentations. I also recognized John Lam (Iron Ruby) and Miguel De Icaza (Mono) in the audience but I missed their talks because I was sick.
One other interesting thing was getting to talk to a guy from Intentional Software. Now this is real brain bending stuff and if you haven’t heard of intentional programming before I suggest you go look it up because it’s a fascinating idea… probably best left for another post.

 

Error Invoking AppDomain Proxy

I’m having one heck of an AppDomain bug. I have a situation where I am creating an AppDomain and then creating an instance and unwrapping it and invoking a method on that proxy instance. The first time I invoke this instance I get successful results and if I have a breakpoint inside of the proxy it will break on it, however the second time I invoke the method it will fail by yielding an incorrect return value.

Also, strangely enough, if I ever try to step INTO the method call with the debugger visual studio will suddenly shutdown. Examining the error code in the debugger doesn’t really reveal anything valuable either. Here is a link to the code in question:

ESharpCompiler.cs