SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Monoでのプログラミング実例集

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

次のページ
自作Cライブラリ内関数の呼び出し

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Monoでのプログラミング実例集連載記事一覧
この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3460 2009/02/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング