AX 2012: evalBuf – Evaluate string expression in X++

evalBuf Function is a very strong API in X++. We can quite easily evaluate complex algebraic expressions given in string and the result is also given back in string. This API should be used along with CodeAccessPermission. The downside of using this API is that the code using this function is not supported in CIL.

This is how we can use this API

static void JobEvalBufDemo(Args _args)
    ExecutePermission perm;
    str strCodeToExecute = "2 + (5*10)";
    str strResult;

    perm = new ExecutePermission();

    if (perm != null)
        perm.assert();				// Grants permission
        strResult = EvalBuf(strCodeToExecute);
        CodeAccessPermission::revertAssert();	// Revoke permission

    info(strFmt("Result is: %1", strResult));
    // info: "Result is: 52"

AX 2012: X++ breakpoints not hitting?

If you are not hitting the breakpoints you set in X++ code as expected then make sure that your code isn’t executed by the SysOperation Framework (formerly known as Business Operations Framework – BOF). If this is the case then you can force the AOS to debug your code in Dynamics AX Debugger by CLEARING the following check in Dynamics AX Development Workspace:

Tools >> Options >> Development >> Execute Business Operations in CIL

Moreover, make sure that Debug mode is set to:

When Breakpoint


Actually AX 2012 executes business logic as compiled .NET CIL to run faster. You can also debug your X++ code in Visual Studio Debugger by opening your method’s xpp file in Visual Studio then attaching to Ax32.exe process (Tools >> Attach to Process). In this way you will be debugging your X++ code in compiled .NET CIL mode. You can find your method’s xpp file under the following location:

C:\Program Files\Microsoft Dynamics AX\6.3\Server\AxaptaDev\bin\XppIL\source\<TableName\ClassName>.<MethodName>.xpp

Now if your X++ code runs under SysOperations Framework, then it will be invoked by any of the following methods:

  • SysDictClass::invokeStaticMethodIL
  • SysDictTable::invokeStaticMethodIL
  • Global::runClassMethodIL
  • Global::runTableMethodIL