Issue with DYNAMIC-INVOKE function in OpenEdge 11.6 causes potential issue with InvokeMethod or InvokeTask style calls


Error Message:Could not locate method 'GetAppserverReleases' with matching signature in class 'Test.SCL1167.CustomerBusinessEntity'. (14457)
Versions Affected:All SmartComponent Library releases
OpenEdge Releases:OpenEdge 11.6
Workaround:See below

Error Details

Could not locate method 'GetAppserverReleases' with matching signature in class 'Test.SCL1167.CustomerBusinessEntity'. (14457)

Call Stack:

InvokeMethod Consultingwerk.OERA.ServiceInterface at line 1022 (C:\Work\SmartComponents4NET\116_64\ABL\Consultingwerk\OERA\ServiceInterface.r)
InvokeMethod Consultingwerk.OERA.ServiceInterface at line 1173 (C:\Work\SmartComponents4NET\116_64\ABL\Consultingwerk\OERA\ServiceInterface.r)
OERA/support/proSIinvokeMethod.p at line 426 (C:\Work\SmartComponents4NET\116_64\ABL\OERA\support\proSIinvokeMethod.r)
InvokeMethod Consultingwerk.OERA.ServiceAdapter at line 737 (C:\Work\SmartComponents4NET\116_64\ABL\Consultingwerk\OERA\ServiceAdapter.r)
C:\Work\SmartComponents4NET\116_64\ABL\Test\SCL1167\test.p at line 128 (C:\Work\SmartComponents4NET\116_64\ABL\Test\SCL1167\test.r)


As documented in SCL-1167 OpenEdge 11.6 has introduced an issue with the DYNAMIC-INVOKE ABL function which may affect InvokeMethod or InvokeTask style calls to the Service Interface or Service Adapter.

The issue can be seen when the Business Entity or Business Task method is defined using an actual user defined class type as the second parameter (parameter object)

                                         INPUT poParameter AS Consultingwerk.CharacterHolder):

and invoking the method through the Service Adapter or Service Interface without passing an actual parameter object instance for the parameter:

DEFINE VARIABLE oParameter AS Consultingwerk.CharacterHolder NO-UNDO .


/*oParameter = NEW Consultingwerk.CharacterHolder () .*/

Consultingwerk.Framework.FrameworkSettings:ServiceAdapter:InvokeMethod ("":U,
        INPUT-OUTPUT DATASET dsCustomer,
        INPUT oParameter) .  

In the above sample the variable oParameter is defined but not initialized.

The above code works fine on OpenEdge 10.2B and OpenEdge 11.3, but raises the above described error on OpenEdge 11.6.

Known Workaround

When the (optional) parameter object to InvokeMethod or InvokeTask type calls to Business Entities or Business Services is not required, defining the method using Progress.Lang.Object as the parameter type avoids the issue:

    METHOD PUBLIC VOID GetAppserverReleases (INPUT-OUTPUT DATASET dsCustomer, 
                                             poParameter AS Progress.Lang.Object):


With Release 11.3 #36358@2016-01-18 we have been able to introduce a workaround to the broken DYNAMIC-INVOKE function based on ABL reflection.