Saturday, May 26, 2012

MDS .net Assembly Error "The Microsoft SQL Server license has expired"

I was trying to get MDS assemblies going.

File Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.ObjectModel;
using Microsoft.MasterDataServices.Deployment;
using Microsoft.MasterDataServices.Services.DataContracts;

namespace ConsoleApplication1
    class Program
        static void Main(string[] args)
                //Reads a model's metadata, business rules, and master data
                ModelReader reader = new ModelReader();

                Collection<identifier> models = reader.GetModels();
                foreach (Identifier modelId in models)
            catch(System.Exception ex)
                Console.WriteLine("Error: " + ex.Message);



        <add connectionstring="Data Source=localhost;Initial Catalog=MDS_2012;Integrated Security=True" name="defaultMdsConnection" providername="System.Data.SqlClient">

referencing the following assemblies from
C:\Program Files\Microsoft SQL Server\110\Master Data Services\WebApplication\bin

When running the app I get the following error:
Olof Szymczak
Error: The Microsoft SQL Server license has expired.

When using reflector, I find that the following method throws the error
File: Services.cs
Namespace: namespace Microsoft.MasterDataServices.Services
private static void CheckExpiration()
            if (isExpired)
                Microsoft.MasterDataServices.Core.Log.Write(LogMessageType.Error, "Evaluation period has expired.");
                EditionExpiredMessage detail = new EditionExpiredMessage();
                FaultException<editionexpiredmessage> exception = new FaultException<editionexpiredmessage>(detail, ErrorStrings.EvaluationExpired);
                throw exception;

It looks like isExpired is set to true. So I looked for the method that is setting isExpired. Drilling in that method I find:
File: Utility.cs
Namespace: Microsoft.MasterDataServices.Core.BusinessEntities
Method: private static QuerySkuValue LoadQuerySkuValueMethod()
in the method it is trying to load a dll C:\Program Files\Microsoft SQL Server\110\Shared\sqlboot.dll
                    zero = LoadLibraryW(dllname); //this fails to load the dll

Checked the location and the dll exists.

Note if I set isExpired = false while debugging the code. I get the correct results.

Eventually I found the answer after downloading, modifing it to point to the MDS 2012 assemblies and reconfiguring the config file. I run it and it worked, I was going WTF. So I checked what was wrong with my project settings, the answer x86, the project.Build.Platform target has to be set to either x64 or Any CPU.

All I can say is what a great way of telling you, that you have compiled the code for the wrong platform by returning an error of "The Microsoft SQL Server license has expired".