[コープ短文]C#でC言語関数を呼び出す(静的呼び出しNative DLL,Linux&Monoプラットフォーム)


以前、Windowsプラットフォームの下でMicrosoftに基づいて「C#でC言語関数を呼び出す」という短文を書いたことがあります.Netの一例です.今日はLinuxプラットフォームの下でMonoベースの例をもう一つの例にします.C#でC言語関数を呼び出す具体的な技術P/Invokeについては、前の記事「[科学普及短文]C#でC言語関数を呼び出す」で紹介したが、知らない読者は見てもいい.ここではあまり紹介しないので、私たちの例を直接見てみよう.
一、動的リンクライブラリの準備
C言語ソース:Test.c以前のWindowsプラットフォームのコードと一致しています.
int sum(int a, int b)  
{  
    return a + b;  
}

gccでダイナミックリンクライブラリlibtestにコンパイルします.so
gcc -c -Wall -Werror -fpic Test.c
gcc -shared -o libtest.so Test.o

それで私たちはlibtestを手に入れた.soというダイナミックリンクライブラリ.
真実はない.スクリーンショットを見てみましょう.
二、C#でP/InvokeでTestを呼び出す.dllでのsum()メソッド
私たちはviで簡単なC#プログラムを書きます:Invoke.cs
このC#プログラムは注釈を除去し、namespace定義、参照を除去し、6行のコードしかありません.
// -----------------------------------------------------------------------  
//   
// P/Invoke example.  
//   
// -----------------------------------------------------------------------
namespace Invoke  
{  
    using System;  
    using System.Runtime.InteropServices;  
  
    ///   
    /// .Net P/Invoke example.  
    ///   
    internal class Program  
    {  
        ///   
        /// Entry point of the application.  
        ///   
        /// Console arguments.  
        internal static void Main(string[] args)  
        {  
            int result = Sum(2, 3);  
            Console.WriteLine("Shared library func execute result: {0}", result);  
        }  
  
        ///   
        /// Call method int sum(int, int) defined in Test.dll  
        ///   
        /// parameter a  
        /// parameter b  
        /// sum of a and b  
        [DllImport("libtest.so", EntryPoint = "sum")]  
        private static extern int Sum(int a, int b);  
    }  
}

コマンドラインでC#ソースファイルをコンパイルします.
gmcs Invoke.cs

これによりmonoベースの実行可能ファイルInvokeがコンパイルする.exe
三、実行
私たちはlibtestをsoは/libディレクトリにコピーして、私たちのプログラムがそれを見つけることができます.どうしてこのディレクトリの下に置いたのですか?これはLinuxオペレーティングシステムがダイナミックリンクライブラリを検索するルールに基づいて行います.この問題を詳しく説明するには、Linuxシステムに関するドキュメント、マニュアルを参照してください.
C#コードのコンパイルを実行して得られた実行可能ファイル:
mono Invoke.exe

「[科学普及短文]C#でC言語関数を呼び出す」という文と同じ実行結果が得られました.
Shared library func execute result: 5

真実はない、もう1枚のスクリーンショットをください.
関連リンク:
  • Interop with Native Libraries http://www.mono-project.com/Interop_with_Native_Libraries
  • ダイナミックライブラリ(.so)http://linux-wiki.cn/wiki/zh-hans/%E5%8A%A8%E6%80%81%E5%BA%93%28.so%29