1.はじめに
P/Invoke(Platform Invoke、プラットフォーム呼び出し)は.NET Frameworkで提供されている、マネージコードからプラットフォームに依存したネイティブライブラリ内のアンマネージ関数を呼び出す機能です。
Windows上の.NET Framework環境では、マネージコードからダイナミックリンクライブラリ(*.dll)内の関数を呼び出す際に使われますが、Linux上のMono環境では、シェアードライブラリ(*.so)内の関数を呼び出す際に使用することができます。
本稿では、Mono環境での基本的なP/Invokeの使用方法、また、P/Invokeを使用した、OpenCOBOLで作成したシェアードライブラリ内の関数を呼び出す方法について解説を行います。
Monoはマルチプラットフォーム向け.NET Framework互換環境です。Monoについては、以下の記事を参考にしてください。
OpenCOBOLについては、布施 榮一氏による以下の記事を参考にしてください。
2.対象読者
- Monoを試してみたい人
- .NET初学者
3.必要な環境
以下の環境で動作確認を行いました。
- OS:openSUSE 10.3(LANG=ja_JP.UTF8)
- Mono 1.9.1
- GCC 4.2.1
- OpenCOBOL 1.0
- mlterm 2.9.3
4.P/Invokeを使用してみた
Cライブラリ内関数の呼び出し例
少し古いですが『.NETアプリをLinux対応にするMono』(developerWorks)においてP/Invokeを使用した数学ライブラリ(libm)内の平方根関数(sqrt)を呼び出すサンプルコードが掲載されています。それを参考にした以下のコードを試してみると
using System;
// P/Invokeサービス提供元
using System.Runtime.InteropServices;
namespace PInvokeExample
{
public class Example1
{
//DllImportAttribute属性による数学ライブラリ(libm.so)の指定
[DllImport("libm")]
// 呼び出す関数のプロトタイプ宣言
static extern double sqrt(double element);
public static void Main(string[] args)
{
double e;
if (args.Length == 1 && Double.TryParse(args[0], out e))
{
Console.WriteLine("「{0}」の平方根は「{1}」。", e, sqrt(e));
}
else
{
Console.WriteLine("Usage: PInvokeExample1.exe [数値]");
}
}
}
}
/*
* ビルド:
*
* gmcs PInvokeExample1.cs
*
* 実行:
*
* mono PInvokeExample1.exe [数値]
*
*/
> mono PInvokeExample1.exe 4649 「4649」の平方根は「68.1835757349231」。
という感じになります。
DllImportAttribute属性で使用するCライブラリを指定し、使用する関数のプロトタイブ宣言(static、extern修飾子を付与する)を行うことで、Cライブラリ内の関数を呼び出すことが可能になります。
プロトタイプ宣言時のメソッド(関数)の引数の型については、呼び出し元(マネージ)と呼び出し先(アンマネージ)の対応をとる必要があります。『プラットフォーム呼び出しのデータ型』(msdn)を参考にしてください。
