Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

MonoでP/Invokeを試してみたよ!

Monoでマネージコードからアンマネージ関数を呼び出す

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/02/19 14:00

 Mono環境での基本的なP/Invokeの使用方法、また、P/Invokeを使用した、OpenCOBOLで作成したシェアードライブラリ内の関数を呼び出す方法について解説を行います。

目次

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)を呼び出すサンプルコードが掲載されています。それを参考にした以下のコードを試してみると

PInvokeExample1.cs
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)を参考にしてください。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Monoでのプログラミング実例集
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5