# Calling the NAG C Library (DLL) from C#

The information here is applicable to the DLLs supplied with CLW3209DAL.

Please note that we recommend using the NAG Library for .NET from within C#. If this does not contain the NAG routines that you require, the NAG Fortran Library for Win32 Applications or the NAG C Library (as described here) may be used.

The NAG C Library uses the following data types as parameters. These are:

1. scalars of type double, int and complex. These are passed either by value or by reference (as pointers to the particular type).
2. enum types.
3. arrays of type double, int and complex.
4. a large number of structures, generally passed as pointers.
5. in a few instances arrays (type double**) that are allocated within NAG routines and have to be freed by users. Also, in one instance, an array (type char***) of strings which is allocated internally.
6. function parameters, also know as call-backs, that are pointers to functions with particular signatures.

As a first step towards making the C Library functions available to the .NET environment, an assembly of imports is needed. This contains:

1. signatures of all the functions we want to call from the NAG C Library.
2. structures with their attributes specified both in terms of their layout and their properties when passed as parameters(in, out or both). This is necessary as structures are a value type in .NET while in C they can be reference types also. Also pointers are more or less a taboo in C#. We avoid the explicit use of pointers by using instead the C# IntPtr type which is in fact equivalent to void * in C. The IntPtr fields can be handled later using marshalling methods.
3. signatures of all call-back types.
4. enum types derived from the C header file, nag_types.h.

The file NagCFunctionsAPI.cs contains signatures of a number of NAG C Library routines and call-back functions. It also contains layouts of some structures used in the library, in particular the NagError structure which is used by almost all the routines in the library. One of the most useful areas of the library is optimisation. We have provided the layout for the Nag_E04_Opt structure along with the signatures for nag_opt_nlp (e04ucc) and the call-backs, NAG_E04UCC_OBJFUN and NAG_E04UCC_CONFUN, which are required by this routine. Some enum types have also been provided.

We have also provided basic C# classes for illustrative purposes. These can be found in the files listed below. For example a sample C# class calling e04ucc can be found in e04ucce.cs. Each of the illustrative classes has a Main method exercising the NAG C example as shown in the C Library manual. If there are particular routines whose signatures cannot be determined from the information we have provided please contact us. We will try our best to help.

These examples may be compiled from the command line (e.g. from a Visual Studio Command Prompt) in the following manner:

csc /unsafe d01ajce.cs NagCFunctionsAPI.cs


Note that because calling NAG C Library functions involves the use of pointers (see above), the "unsafe" compiler option must be specified.

The function declarations in NagCFunctionsAPI.cs are based on the stand-alone version of the NAG C Library DLL (CLW3209DA_nag.dll); to specify the version of the DLL which uses the MKL BLAS/LAPACK instead (CLW3209DA_mkl.dll), replace CLW3209DA_nag.dll by CLW3209DA_mkl.dll in the DllImport attribute.

Remember also that to be able to run the program after you have compiled it, the NAG C Library DLL will need to appear somewhere in your current path. For example, if the DLLs are in C:\Program Files\NAG\CL09\clw3209dal\bin, then your PATH environment variable must contain this folder. If you are using the MKL-based version of the NAG C Library (CLW3209DA_mkl.dll), then the folder containing the MKL DLLs should also be on your path, but should appear later in the path than the bin folder for the NAG C Library DLLs, e.g.

C:\Program Files\NAG\CL09\clw3209dal\bin;C:\Program Files\NAG\CL09\
clw3209dal\MKL_ia32_10.2\bin;<rest of path>


Tested with Visual Studio 2005 (Visual C# 2005 Compiler version 8.0), Visual Studio 2008 (Visual C# 2008 Compiler version 3.5) and Visual Studio 2010 (Visual C# 2010 Compiler version 4.0).