[コープ短文]C#でC言語関数を呼び出す(静的呼び出しNative DLL,Linux&Monoプラットフォーム)
以前、Windowsプラットフォームの下でMicrosoftに基づいて「C#でC言語関数を呼び出す」という短文を書いたことがあります.Netの一例です.今日はLinuxプラットフォームの下でMonoベースの例をもう一つの例にします.C#でC言語関数を呼び出す具体的な技術P/Invokeについては、前の記事「[科学普及短文]C#でC言語関数を呼び出す」で紹介したが、知らない読者は見てもいい.ここではあまり紹介しないので、私たちの例を直接見てみよう.
一、動的リンクライブラリの準備
C言語ソース:Test.c以前のWindowsプラットフォームのコードと一致しています.
gccでダイナミックリンクライブラリlibtestにコンパイルします.so
それで私たちはlibtestを手に入れた.soというダイナミックリンクライブラリ.
真実はない.スクリーンショットを見てみましょう.
二、C#でP/InvokeでTestを呼び出す.dllでのsum()メソッド
私たちはviで簡単なC#プログラムを書きます:Invoke.cs
このC#プログラムは注釈を除去し、namespace定義、参照を除去し、6行のコードしかありません.
コマンドラインでC#ソースファイルをコンパイルします.
これによりmonoベースの実行可能ファイルInvokeがコンパイルする.exe
三、実行
私たちはlibtestをsoは/libディレクトリにコピーして、私たちのプログラムがそれを見つけることができます.どうしてこのディレクトリの下に置いたのですか?これはLinuxオペレーティングシステムがダイナミックリンクライブラリを検索するルールに基づいて行います.この問題を詳しく説明するには、Linuxシステムに関するドキュメント、マニュアルを参照してください.
C#コードのコンパイルを実行して得られた実行可能ファイル:
「[科学普及短文]C#でC言語関数を呼び出す」という文と同じ実行結果が得られました.
真実はない、もう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
一、動的リンクライブラリの準備
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枚のスクリーンショットをください.
関連リンク: