自 C# 中调用 NAG C 算法库 (DLL)
本篇文章是以 NAG C 算法库 DLL 版本 CLW3209DAL 进行说明。请您注意,我们仍建议您在 C# 环境中采用 NAG .NET 算法库。如果在 NAG .NET 算法库中并没有您需要的函数, 您即可使用 NAG Fortran 算法库 或本文提到的 NAG C 算法库。
NAG C 算法库中的参数使用以下的资料型别,分别为:
- 纯量:double, int 与 complex。以数值或指标传递
- 列举型别
- 数组:double, int 与 complex
- 大部分的结构都以指针传递
- 部分的数组 (type double**) 在 NAG 函数中配置,需要用户自行释放 (free)。而 (type char***) 数组是在函数内部自行配置
- 回调函数参数 (call-backs),以特别的指针型态传递
在 .NET 环境中调用 C 函数的第一步,是需要将其加载,其中包含了:
- 调用到 NAG C 函数 (signatures) 的声明
- 结构以及其属性,其会依照传递参数时的特性 (in, out or both) 有所不同。 在 .NET 中结构是一个数值型态,而 C 语言中为一参考的型态。指标在 C# 中是一个大忌。我们避免使用 在 C# 中对应指标的 IntPtr 型别。IntPtr 往后可透过 marshalling 方法处理
- 所有回调函数 (call-back) 的声明
- C 头文件中 (nag_types.h) 的列举型别
在 NagCFunctionsAPI.cs 文件中,包含了许多 NAG C 函数与回调函数的定义。 也同时包含了许多算法库中所用到的结构型态,尤其 NagError 结构是在大部分的 NAG 函数中都被使用。 在算法库中最广为使用的是优化函数,我们在本文中提供了函数中会用到的 Nag_E04_Opt 结构以及 nag_opt_nlp (e04ucc) 的定义与回调函数 NAG_E04UCC_OBJFUN 与 NAG_E04UCC_CONFUN 的定义,这些都是调用优化函数所必须提供的。 也包含了列举型态。
我们同时也提供了一些基本的 C# 类别示例。您可以参考以下链接。 例如调用 e04ucc 的 C# 程序示例便是 e04ucce.cs。每个示例类别中都有 Main 方法,并且提供与 NAG C 算法库说明文件中所提供的示例一样的 案例。如果您需要的函数定义并不在我们所提供的例子中,您可以与 与我们联络,我们将乐于提供协助。
- d01ajce.cs
- e01bace.cs
- e01bece.cs
- e02adce.cs
- e02bace.cs
- e04ccce.cs
- e04nfce.cs
- e04ucce.cs
- e04unce.cs
- e04wdce.cs
- f02aace.cs
- f08fqce.cs
- g02dace.cs
- g02jace.cs
- g03efce.cs
- g05ecce.cs
这些示例可以直接在命令行中透过以下方式编译 (Visual Studio 命令行):
csc /unsafe d01ajce.cs NagCFunctionsAPI.cs
因为调用 NAG C 算法库的函数是使用指针型态,所以必须采用 "unsafe" 参数进行编译。
在 NagCFunctionsAPI.cs 所需要的函数定义是基于 NAG C 算法库 DLL 版本 (CLW3209DA_nag.dll); 若您要链结 MKL,则您需要在程序中的 DllImport 叙述中将原先的 CLW3209DA_nag.dll 取代为 CLW3209DA_mkl.dll。
您也需要特别留意,当您要執行编译过后的程序时,NAG C 算法库 DLL 档也必须在同一个路径中。例如: 如果 DLL 是在
C:\Program Files\NAG\CL09\clw3209dal\bin;C:\Program Files\NAG\CL09\ clw3209dal\MKL_ia32_10.2\bin;<...>
以上示例已经在 Visual Studio 2005 (Visual C# 2005 Compiler version 8.0), Visual Studio 2008 (Visual C# 2008 Compiler version 3.5) 与 Visual Studio 2010 (Visual C# 2010 Compiler version 4.0) 环境中测试通过。