After the number of upgrades that myself any my team have performed we've found that there is a bit of work that needs to be done to make your 3.0 code work in 4.0. This code that I'm talking about is not scripting code, but callout, workflow assemblies, and custom webpages. Here are some tips and tricks that we've found you should do to make everything work smoothly. A lot of times a majority of your custom code will work but there will be a few that don't work. I've had callouts that were in the same DLL file and 80% of them worked and I had to do a little tweaking to get the other 20% up and running smoothly.
1. Move all code to ASP .NET 2.0
This means that you should convert your code from Visual Studio 2003 to Visual Studio 2005. CRM 4.0 is built on .NET 2.0 and everything just runs more smoothly when its all on the same framework. This shouldn't be a big deal for callouts but for some webpages this could be an issue if you need to replace some .NET 1.1 controls with .NET 2.0 controls. Such as DataGrids, which become GridViews in .NET 2.0.
2. Remove and re-add the CRM web reference
The web references go to ASPX pages (both in the 3.0 and 4.0 URL's). You can use the same URL (http://<CRMServerName>/MSCRMServices/2007/CRMService.asmx) and Visual Studio will redirect to the CRMServiceWSDL.aspx page automatically for you. Either way, I recommend rebuilding it so that it runs smoother. I have done this trick on probably all of the upgrades I've done to get at least one callout to work.
3. There maybe a few code changes that you will have to make manually.
As one of my readers, Maria, pointed out, CRMFloat.Value is now a double instead of a float. Unfortunately I don't know all of the in's and out's yet but just know that you may need to do some code combing if worst comes to worst. Obviously leave this option as a last resort as it is the most tedious and time consuming.
4. Restart the Async Service whenever you do an IISReset.
Apparently you shouldn't have to, but I've spoken with a couple of MSSupport reps and they will still restart the Async Service after an IISReset. They aren't linked but they do feed off of each other and I always kick myself or at least slap myself really hard whenever the solution to my problems in coding is restarting a service. It doesn't hurt to do it, and it adds what, 3 extra seconds if you've already gotten approval to bring one or the other down? I say spend the extra 3 seconds just to be sure.
That's it. Not too many, but then again if there were many more I'd be really concerned.
Hopefully all of your upgrades are running smoothly and everyone is enjoying the new version of MSCRM.
Dynamic Methods Inc.