Running Microsoft CRM 3.0 under .NET 2.0

I’ve been told and have read many times that it’s not possible to run Microsoft CRM 3.0 under .NET 2.0.  Well, I guess ‘not possible’ could just mean ‘not supported’.  All of our code base is now .NET 2.0 and I was loathed to maintain .NET 1.1 versions of our framework libraries jsut for a couple of calls out of CRM. 

I had previously found this article on extending CRM with ASP.NET 2.0 apps, but needed to create a Workflow component to call into our internal systems and found that this obviously didn’t work because (all of) CRM runs under .NET 1.1.

A bit of ‘give it a try’ later and I can reveal that it is indeed possible to successfully run CRM 3.0 in a .NET 2.0 process, and also use .NET 2.0 assemblies with Workflow.  I’ll leave it up to the reader to decide whether this is a good idea that they’d actually want to implement!  The process isn’t too onerous so wouldn’t take long to roll back if you encountered problems.

If you’re still up for giving it a try then you’ll need to alter the ASP.NET properties for the CRM Web Site and Service …

Make sure you’ve set up separate app pools (see below), as one will run all your ASP.NET 1.1 apps, and the other will run the .NET 2.0 apps.  You can’t run a mixture of runtimes within the same app pool.

Change the Microsoft CRM v3.0 site’s root folder, AND the MSCRMServices virtual folder as below to use .NET 2.0 (and make sure they’re configured to be in your .NET 2.0 app pool).

Now to ensure Workflow can use .NET 2.0 you’ll need to add a .NET config file to force the Workflow Service to run in the .NET 2.0 runtime.

Stop the “Microsoft CRM Workflow Service”, then Add a file as below in the CRM Workflow binary folder.

The contents of the file should be as follows:

    <supportedRuntime version=”v2.0.50727″ />

Restart the Workflow Service (and probably do another IISReset for good measure), and you should find everything comes up fine, and you’ll be able to configure Workflow as per normal but now with .NET 2.0 assemblies.  I’m not too familiar with ‘where’ callouts run, but I’d presume that the same principles should apply and .NET 2 assemblies should work OK.

This procedure is obviously not supported by Microsoft so you use at your own risk, but I’ve had no problems so far….