In Focus

Calling COBOL from C#

There is a lot of COBOL code in production around the world. Rewriting that code into another langugage just to change the language makes little sense and introduces a high level of risk. Instead of changing the COBOL code that has been working and doing it's job for quite a while, why not interact with it using C#? This article shows how to utilize C# to call both procedural and object oriented COBOL.

The Microsoft .NET Framework is built upon the C#, pronounced 'c sharp', language. This 'new' language is object oriented and has a different manner of defining data types than COBOL does. What .NET provides though is a means to enable businesses to use their existing COBOL business logic while enhancing the applications they support with new front-ends developed in C#. 

This article explores calling a standard procedural based COBOL program from C#. It also provides an example of calling an object oriented COBOL class from C#! There are two methods that can be employed when calling a procedural COBOL program: a direct call or a call through an interface program. A direct call may require changes to the original procedural COBOL code; using an interface would require no changes to the original procedural code. We have elected to demonstrate the interface method. The interface method creates an object oriented COBOL program that utilizes the standard .NET data types as input parameters but then changes, or marshalls, the data to standard COBOL data types (PIC X, PIC 9) before calling the procedural COBOL program. Again, the interface method virtually eliminates coding changes to the procedural COBOL programs. For a more indepth explanation of how to work with code in other languages see the topic "Interoperating with Managed Code in Other Languages" in the Micro Focus Net Express Help.

To begin, here is the C# screen we created:


We will assume you are comfortable with the C# language. If you have any questions in this area please consult with one of your local C# experts.
Since the code we are calling is an Object Oriented COBOL module and the methods are static there is no additional coding that has to be added to the C# code to instantiate the COBOL class. Within the REFERENCEs for the C# project the user has to add references to the COBOL interface program, the Micro Focus COBOL environment and the modules the interface program will be calling.


To invoke the interface class that will in turn call the procedural COBOL program we use the "button_click" event. The code to enable this is:

The sub routine first declares three variables of integer data type and then converts the input the user has entered to INT16 (a numeric .NET data type) and stores them in the newly declared variables. The event then calls the method "ADDER" in the interface program. The method name is the same as the program name the interface will be calling. By using the same name for both the METHOD-ID and the procedural COBOL the programmer will find this to be very easy to remember and if maintenance is required will know immediately where to go in the interface program to make the necessary changes.

Notice the presence of the 'ref' attribute on the variables being passed to the COBOL module. 'REF' instructs C# to work with the same variable as the one being used in the function call, not just a variable that has the same value. The only issue when using 'REF' all variables must not only be declared but must be initialized.

Another method would be to use the 'OUT' parameter but this would then have required a change to the COBOL module to add the custom attribute 'OutAttribute' to the third parameter.


The ZIP file has all the necessary source code for you to follow along and see how the code is to be structured. One very important item to remind you of is the need to add in references to other projects when you are passing control between them. This is probably one of the most common errors when starting in the .NET environment. Once you get used to the environment though those issues will go away!

Happy Coding!