Sign in Join
Wiki copytemporary

Using Pascal Libraries with .NET and Mono/ja

English · Italiano · 日本語

はじめに

Microsoft 社は、"アンマネージドコード(unmanaged code)" と非常に互換性のある.NET framework を提供しています。アンマネージドコードというと何か野蛮で危険なもののように聞こえますが、これはネイティブの Windows ライブラリの書式の"レガシー"なコードのことをいいます。Mono プロジェクトには Linux と MacOS X のネイティブライブラリに対して(.NET と)同様のサポートが含まれています。これは Free Pascal でコンパイルしたライブラリを Windows の .NET アプリケーションや Linux や Mac OS X の Mono のアプリケーションから使えることを意味します。

シンプルな Pascal ライブラリ

次のPascalコードをコピーして SimpleLib.pas というファイル名で保存して下さい:

pascal
library SimpleLib;
pascal
function MySucc(AVal : Int64) : Int64; stdcall;
begin
  Result := System.Succ(AVal);
end;
pascal
function MyPred(AVal : Int64) : Int64; stdcall;
begin
  Result := System.Pred(AVal);
end;
pascal
exports
{$IFDEF DARWIN}  {OS X entry points}
  MySucc name '_MySucc',
  MyPred name '_MyPred',
{$ENDIF}
  MySucc,
  MyPred;
pascal
end.

Mac OS X (DARWIN)上でコンパイルした場合、条件付きの指示に注意して下さい。どうも OS X ダイナミックリンカーは アンダースコアから始まるライブラリのエントリーポイントを探そうとするようです。

ここで Free Pascal でライブラリをコンパイルします:

pascal
fpc -Sd SimpleLib.pas

Windows 上では、simplelib.dll というファイルを作成します。MacOS X 上では、libsimplelib.dylib というファイルを作成します。Linux 上では、simplelib.so というファイルを作成します。MacOS X や Linux では、コンパイルしたライブラリファイルを simplelib.dll にリネームします:

pascal
mv libsimplelib.dylib simplelib.dll

シンプルな VB.NET アプリケーション

次の VB.NET コードを TestLib.vb というファイル名で保存して下さい:

pascal
Imports System
Imports System.Runtime.InteropServices
pascal
Public Class TestLib
pascal
Const SimpLibName = "simplelib.dll"
pascal
'Declare external functions using the DllImport attribute.
pascal
<DllImport(SimpLibName, EntryPoint:="MySucc", _
           CallingConvention:=CallingConvention.StdCall)> _
           Public Shared Function Succ(ByVal AVal As Long) As Long
  End Function
pascal
<DllImport(SimpLibName, EntryPoint:="MyPred", _
           CallingConvention:=CallingConvention.StdCall)> _
           Public Shared Function Pred(ByVal AVal As Long) As Long
  End Function
pascal
Public Shared Sub Main()
pascal
Dim TestVal As Long
pascal
Try
  TestVal = 123
  Console.WriteLine("Value is " & TestVal)
  Console.WriteLine("Successor is " & Succ(TestVal))
  Console.WriteLine("Predecessor is " & Pred(TestVal))
Catch e As Exception
  Console.WriteLine(e)
End Try
pascal
End Sub  'Main
pascal
End Class  'TestLib

もし Windows 上に .NET framework をインストールしているのなら、次のようにすればコードをコンパイルできます:

pascal
[pathto]vbc TestLib.vb

[pathto] は .NET framework (.NET 1.1 での例: c:\windows\microsoft.net\framework\v1.1.4322\ ) へのパスです。これで TestLib.exe というファイルが作成されます。

もし Mono をインストールしてれば、同じように次の手順でコードをコンパイルすることができます:

pascal
mbas TestLib.vb

今のところ、Mono の VB.NET コンパイラはアルファ版の段階で、このコードはコンパイルできないかもしれません。もしコンパイルエラーが出たら、C# バージョンでコンパイルしてみて下さい。

シンプルな C# アプリケーション

ここにはC#互換のコードがあります。これを TestLib.cs というファイル名で保存します。

pascal
using System;
using System.Runtime.InteropServices;
pascal
public class TestLib {
pascal
const string SimpLibName = "simplelib.dll";
pascal
//Declare external functions using the DllImport attribute.
pascal
[DllImport(SimpLibName, EntryPoint="MySucc",
           CallingConvention=CallingConvention.StdCall)]
           public static extern long Succ(long AVal);
pascal
[DllImport(SimpLibName, EntryPoint="MyPred", 
           CallingConvention=CallingConvention.StdCall)] 
           public static extern long Pred(long AVal);
pascal
public static void Main()
{
  long TestVal;
pascal
try
{
  TestVal = 123;
  Console.WriteLine("Value is " + TestVal);
  Console.WriteLine("Successor is " + Succ(TestVal));
  Console.WriteLine("Predecessor is " + Pred(TestVal));
}
catch(Exception e)
{
  Console.WriteLine(e);
}
pascal
}
pascal
}

.NET を使って次の方法でコンパイルできます。

pascal
[pathto]csc TestLib.cs

Mono を使って次の方法でコンパイルできます。

pascal
mcs TestLib.cs

.NET、Monoのどちらであっても、TestLib.exe というファイルが作成されます。

シンプルなアプリケーションの実行

.NETでは、コンパイルしたアプリケーションを実行方法は次の通りです。

pascal
testlib

.NET でライブラリを見つけられたら、アプリケーションはコンソール上に次の出力を行ないます:

pascal
Value is 123
Successor is 124
Predecessor is 122

Mono であれば、次のように実行します:

pascal
mono TestLib.exe

この際、Mono は simplelib.dll ファイルを探します --これが、上の Linux と Mac OS X 環境でライブラリ名を変更するように述べた理由です。

.NET/Mono の ".exe" ファイルは、実際にはネイティブコードを含んではいません。その代わり、.NET/Mono のランタイムによって実行されるバイトコードを含んでいます。その結果、Windows 上で作成した .NET の実行ファイルを、Mono を使ってリコンパイルすることなく Mac OS X や Linux 上で動かすことができるようになります(その逆も同様です)。

サポートを使用としてるプラットホーム用の Pascal ライブラリについてはリコンパイルする必要があります。

.Net/Mono からネイティブライブラリを使用する

なぜ、全てのコードを VB.NET や C# にしないのでしょうか?それは状況によって、それが最善ではない場合があるからです:

Mono tips

1. Visual Basic は Linux や MacOS X からするとかなり異質ですので、C++(Object Pascal)によく似たC#で .NET や mono アプリケーションの開発をしたくなると思います。

2. Mac OS X の Mono はアンインストール用のスクリプトを含んでいます。新しいバージョンの Mono をインストールする際は、予めアンインストール用のスクリプトを実行してください:

3. 通常、あなたが作成したライブラリの中で Lazarus のユニットを使用しないでください。通常、ライブラリはユーザインタフェースを含んではいけません。System、SysUtils、StrUtils、DateUtils、Classes、Variants、Math のような Free Pascal のユニットに止めておいて下さい。

4. もし、作成するライブラリでどうしてもインターフェースが必要なら、Windows フォームアプリケーションとしてそれをプログラムして下さい。ここに簡単な例があります。これをコピーして MyForm.cs というファイル名で保存します。

pascal
using System.Windows.Forms;
pascal
public class MyForm: Form
{
  public static void Main()
  {
    MyForm aForm = new MyForm();
pascal
aForm.Width = 350;
pascal
Button b = new Button();
b.Left = 15;
b.Top = 20;
b.Width = aForm.Width-30;
b.Height = 30;
b.Text = "A Button";
aForm.Controls.Add(b);
pascal
aForm.Text = "A .NET/Mono Windows Forms App";
pascal
Application.Run(aForm);
pascal
}
pascal
}

これを次のようにして、Mono でコンパイルします:

pascal
mcs -r:System.Windows.Forms MyForm.cs

次のようにして実行します:

pascal
mono MyForm.exe

Mac OS X 上では、Lazarus の実行がそうであるように、現バージョンの Mono も X11 を要求するので、 プログラムを実行するためには X11 ウィンドウ(ターミナルウィンドウではなく)を開いておく必要があります。

5. もし .NET や Mono から Pascal ライブラリを使用することに関して質問やコメントがあれば、Lazarus フォーラムにそれを投稿してください。


From the Free Pascal wiki, page "Using Pascal Libraries with .NET and Mono/ja", as it stood on 2006-08-22 after a change by Tnishiki, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Edited on wiki.freepascal.org by 2 people, 2006

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
Tnishiki
Tnishiki
Tnishikiシンプルな Pascal ライブラリ
Tnishiki
Swen (minor)
Tnishikiシンプルな VB.NET アプリケーション
Tnishiki
Tnishikiシンプルな C# アプリケーション
Tnishikiシンプルな Pascal ライブラリ
Tnishikiはじめに
Tnishikiシンプルなアプリケーションの実行
Tnishiki
TnishikiMono tips
Tnishikiシンプルなアプリケーションの実行
Tnishiki.Net/Mono からネイティブライブラリを使用する
TnishikiMono tips
Tnishikiシンプルな Pascal ライブラリ
Tnishikiシンプルな Pascal ライブラリ

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.