Wednesday, February 6, 2013

AX 2012's Hidden Compile Errors

This post title caught your attention huh? Well, it should. For about half a year or longer now, we've been struggling with a strange issue with AX 2012 compiles. We finally found more or less what the issue was, but were unable to reliably replicate the issue. Finally in October, one of our developers here at Sikich took the time to replicate an existing issue in a vanilla AX environment and was able to reliably replicate the issue for Microsoft to investigate. And I'm glad to say that we now officially received a kernel hotfix.

For future reference, this issue pertains to all current versions of AX 2012 as of this date (February 6th, 2013). This means:

AX 2012 RTM
AX 2012 CU1
AX 2012 CU2
AX 2012 CU3
AX 2012 CU4
AX 2012 FPK
AX 2012 FPK CU3
AX 2012 FPK CU4
AX 2012 R2

Obviously if you received kernel hotfixes for any of these versions, you may have received this kernel hotfix as well. I don't have build numbers for all of these yet.

Ok, so on to the issue. As you are probably aware as a reader of this blog, we heavily rely on automated builds using TFS. We started noticing builds completing successfully without error, but once installed at a client they resulted in compile errors. Depending on the type of error this may or may NOT result in a CIL generation error as well.
We found out that indeed there were compile errors, but they were never captured in our automated build. Turns out that it is not our build process, but AX that is not reporting the compile errors.

Let me provide you with the example we gave Microsoft. Note this is not a direct CODE example per se, but a compile error nonetheless. There are plenty of other opportunities for compile errors not being thrown, this is just one easy and quick example. Things we saw were missing methods, missing variable declarations, all sorts of things that SHOULD result in a compile error but weren't. Note that an individual compile on only 1 object always results in an error correctly, this issue applies to full compiles or multiple-object compiles (full AOT compile, compiling an AOT project, etc).

Let's start by creating a new project for a service we'll be creating. I called mine "DMTestService". Next, we'll create a service. We create a new class called "TestServiceClass", and add a method "MyOperation". I'm not going to put any code in it since we're just interested in the compile error and not in it actually doing anything.


[SysEntryPointAttribute]
public void MyOperation()
{
}


Next, we create a new service (right-click the project and select New > Service or go to the Services node in the AOT, right-click it and select "New Service"). We will call this service "TestService". Right-click the new TestService and select "Properties". In the properties find the "Class" property, and enter the name of the class we created previously (in my case "TestServiceClass").


Next, right-click on the "Operations" node under your service, and select "Add Operation".


On the Add Service Operation dialog, click the Add checkbox for the MyOperation method, and click OK. This will add the operation to the service.



Alright, good enough. So now if you right-click compile the service, no errors. Now let's break this! Open the MyOperation method on the TestServiceClass and make the method static.

[SysEntryPointAttribute]
public static void MyOperation()
{
}


This will make the operation on your service invalid, as there is no longer an instance method called "MyOperation". And indeed, if you right-click on the TestService and select "Compile", you get this compile error:


And now what we've all been (not so much) waiting for... Right-click your PROJECT and select compile... The error goes away... no errors in the project!!
If you take an XPO of this and import somewhere else, you'll also notice the XPO import does not throw a compile error. If you do a full AOT compile, no error is thrown.

For those of you questioning if this really is a compile error, it's not about the TYPE of compile error necessarily, the problem is errors are reported in the compiler output but cleared out later. The issue has to do with the number of compile passes AX does.

Thanks to the members of my development team to figure out an easy way to reproduce the issue so we could report to Microsoft!


If you wish to get the hotfix from Microsoft support, the KB number is 2797772. It is listed on the "hotfixes" page on PartnerSource, if you have access to that (no download link, you'll have to request it from Microsoft).

6 comments:

  1. Great works as always Joris & team!!! Good detective work and persistence pays off for the DAX2012 community and our customers.

    ReplyDelete
  2. Great post Joris! Facing the issue myself today after a full compilation while upgrading to R2... Hotfix requested!

    ReplyDelete
  3. Today I received a hotfix for the R2 version from Microsoft. Tested and confirmed to be working.

    http://hotfixv4.microsoft.com/Microsoft%20Dynamics%20AX%202012%20R2/nosp/KB2822515/6.2.1000.582/free/460217_intl_i386_zip.exe

    ReplyDelete
  4. Replies
    1. Since this was quite a while ago, this fix was rolled forward into new versions, including R2 and R3.

      Delete