Sign in Join
Wiki copytemporary

Using Pascal Libraries with .NET and Mono/ja: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Using Pascal Libraries with .NET and Mono/ja

OldNewLine
1+## はじめに
2+
3+Microsoft 社は、"アンマネージドコード(unmanaged code)" と非常に互換性のある.NET framework を提供しています。アンマネージドコードというと何か野蛮で危険なもののように聞こえますが、これはネイティブの Windows ライブラリの書式の"レガシー"なコードのことをいいます。[Mono](http://www.mono-project.com/Main_Page) プロジェクトには Linux と MacOS X のネイティブライブラリに対して(.NET と)同様のサポートが含まれています。これは Free Pascal でコンパイルしたライブラリを Windows の .NET アプリケーションや Linux や Mac OS X の Mono のアプリケーションから使えることを意味します。
4+
5+## シンプルな Pascal ライブラリ
6+
7+次のPascalコードをコピーして SimpleLib.pas というファイル名で保存して下さい:
8+
9+ library SimpleLib;
10+
11+ function MySucc(AVal : Int64) : Int64; stdcall;
12+ begin
13+ Result := System.Succ(AVal);
14+ end;
15+
16+ function MyPred(AVal : Int64) : Int64; stdcall;
17+ begin
18+ Result := System.Pred(AVal);
19+ end;
20+
21+ exports
22+ {$IFDEF DARWIN} {OS X entry points}
23+ MySucc name '_MySucc',
24+ MyPred name '_MyPred',
25+ {$ENDIF}
26+ MySucc,
27+ MyPred;
28+
29+ end.
30+
31+Mac OS X (DARWIN)上でコンパイルした場合、条件付きの指示に注意して下さい。どうも OS X ダイナミックリンカーは アンダースコアから始まるライブラリのエントリーポイントを探そうとするようです。
32+
33+ここで Free Pascal でライブラリをコンパイルします:
34+
35+ fpc -Sd SimpleLib.pas
36+
37+Windows 上では、simplelib.dll というファイルを作成します。MacOS X 上では、libsimplelib.dylib というファイルを作成します。Linux 上では、simplelib.so というファイルを作成します。MacOS X や Linux では、コンパイルしたライブラリファイルを simplelib.dll にリネームします:
38+
39+ mv libsimplelib.dylib simplelib.dll
40+
41+## シンプルな VB.NET アプリケーション
42+
43+次の VB.NET コードを TestLib.vb というファイル名で保存して下さい:
44+
45+ Imports System
46+ Imports System.Runtime.InteropServices
47+
48+ Public Class TestLib
49+
50+ Const SimpLibName = "simplelib.dll"
51+
52+ 'Declare external functions using the DllImport attribute.
53+ <DllImport(SimpLibName, EntryPoint:="MySucc", _
54+ CallingConvention:=CallingConvention.StdCall)> _
55+ Public Shared Function Succ(ByVal AVal As Long) As Long
56+ End Function
57+
58+ <DllImport(SimpLibName, EntryPoint:="MyPred", _
59+ CallingConvention:=CallingConvention.StdCall)> _
60+ Public Shared Function Pred(ByVal AVal As Long) As Long
61+ End Function
62+
63+ Public Shared Sub Main()
64+
65+ Dim TestVal As Long
66+
67+ Try
68+ TestVal = 123
69+ Console.WriteLine("Value is " & TestVal)
70+ Console.WriteLine("Successor is " & Succ(TestVal))
71+ Console.WriteLine("Predecessor is " & Pred(TestVal))
72+ Catch e As Exception
73+ Console.WriteLine(e)
74+ End Try
75+
76+ End Sub 'Main
77+
78+ End Class 'TestLib
79+
80+もし Windows 上に .NET framework をインストールしているのなら、次のようにすればコードをコンパイルできます:
81+
82+ [pathto]vbc TestLib.vb
83+
84+\[pathto\] は .NET framework (.NET 1.1 での例: c:\windows\microsoft.net\framework\v1.1.4322\\ ) へのパスです。これで TestLib.exe というファイルが作成されます。
85+
86+もし Mono をインストールしてれば、同じように次の手順でコードをコンパイルすることができます:
87+
88+ mbas TestLib.vb
89+
90+今のところ、Mono の VB.NET コンパイラはアルファ版の段階で、このコードはコンパイルできないかもしれません。もしコンパイルエラーが出たら、C# バージョンでコンパイルしてみて下さい。
91+
92+## シンプルな C# アプリケーション
93+
94+ここにはC#互換のコードがあります。これを TestLib.cs というファイル名で保存します。
95+
96+ using System;
97+ using System.Runtime.InteropServices;
98+
99+ public class TestLib {
100+
101+ const string SimpLibName = "simplelib.dll";
102+
103+ //Declare external functions using the DllImport attribute.
104+ [DllImport(SimpLibName, EntryPoint="MySucc",
105+ CallingConvention=CallingConvention.StdCall)]
106+ public static extern long Succ(long AVal);
107+
108+ [DllImport(SimpLibName, EntryPoint="MyPred",
109+ CallingConvention=CallingConvention.StdCall)]
110+ public static extern long Pred(long AVal);
111+
112+ public static void Main()
113+ {
114+ long TestVal;
115+
116+ try
117+ {
118+ TestVal = 123;
119+ Console.WriteLine("Value is " + TestVal);
120+ Console.WriteLine("Successor is " + Succ(TestVal));
121+ Console.WriteLine("Predecessor is " + Pred(TestVal));
122+ }
123+ catch(Exception e)
124+ {
125+ Console.WriteLine(e);
126+ }
127+ }
128+ }
129+
130+.NET を使って次の方法でコンパイルできます。
131+
132+ [pathto]csc TestLib.cs
133+
134+Mono を使って次の方法でコンパイルできます。
135+
136+ mcs TestLib.cs
137+
138+.NET、Monoのどちらであっても、TestLib.exe というファイルが作成されます。
139+
140+## シンプルなアプリケーションの実行
141+
142+.NETでは、コンパイルしたアプリケーションを実行方法は次の通りです。
143+
144+ testlib
145+
146+.NET でライブラリを見つけられたら、アプリケーションはコンソール上に次の出力を行ないます:
147+
148+ Value is 123
149+ Successor is 124
150+ Predecessor is 122
151+
152+Mono であれば、次のように実行します:
153+
154+ mono TestLib.exe
155+
156+この際、Mono は simplelib.dll ファイルを探します --これが、上の Linux と Mac OS X 環境でライブラリ名を変更するように述べた理由です。
157+
158+.NET/Mono の ".exe" ファイルは、実際にはネイティブコードを含んではいません。その代わり、.NET/Mono のランタイムによって実行されるバイトコードを含んでいます。その結果、Windows 上で作成した .NET の実行ファイルを、Mono を使ってリコンパイルすることなく Mac OS X や Linux 上で動かすことができるようになります(その逆も同様です)。
159+
160+サポートを使用としてるプラットホーム用の Pascal ライブラリについてはリコンパイルする必要があります。
161+
162+## .Net/Mono からネイティブライブラリを使用する
163+
164+なぜ、全てのコードを VB.NET や C# にしないのでしょうか?それは状況によって、それが最善ではない場合があるからです:
165+
166+- C# で書き直し(もしくは再デバッグ)したくないような巨大で完全な Pascal コードを持っている場合
167+- ネイティブアプリケーション、.NET/Monoアプリケーションの両方から必要とされるネイティブライブラリを持っている場合
168+- パフォーマンス上の理由がある場合(たいていの場合、 FPC や Delphi でコンパイルされたネイティブコードは .NET/Mono 上で動作する同じ内容のバイトコードに比べて速く動きます)
169+- .NET/Mono では簡単にアタッチできないようなローレベルの処理システムが必要な場合
170+- 多人数開発の .NET/Mono プロジェクトのために、習熟している言語による開発コードがすぐに必要な場合
171+
172+## Mono tips
173+
174+**1.** Visual Basic は Linux や MacOS X からするとかなり異質ですので、C++(Object Pascal)によく似たC#で .NET や mono アプリケーションの開発をしたくなると思います。
175+
176+**2.** Mac OS X の Mono はアンインストール用のスクリプトを含んでいます。新しいバージョンの Mono をインストールする際は、予めアンインストール用のスクリプトを実行してください:
177+
178+- ファインダーで /Library/Receipts を開きます
179+- MonoFramework.pkg の上で Ctrl を押しながらマウスをクリックします。ポップアップメニュー上で必要なパッケージを選択します。
180+- Contents フォルダをダブルクリックします。
181+- Resources フォルダをダブルクリックします。
182+- uninstallMono.sh をドラッグしてデスクトップにコピーします。
183+- ターミナルを開きます。
184+- cd desktop でデスクトップにカレントディレクトリを移します。
185+- sudo ./uninstallMono.sh を実行します。パスワードを聞かれたら入力します。
186+
187+**3**. 通常、あなたが作成したライブラリの中で Lazarus のユニットを使用しないでください。通常、ライブラリはユーザインタフェースを含んではいけません。System、SysUtils、StrUtils、DateUtils、Classes、Variants、Math のような Free Pascal のユニットに止めておいて下さい。
188+
189+**4.** もし、作成するライブラリでどうしてもインターフェースが必要なら、Windows フォームアプリケーションとしてそれをプログラムして下さい。ここに簡単な例があります。これをコピーして MyForm.cs というファイル名で保存します。
190+
191+ using System.Windows.Forms;
192+
193+ public class MyForm: Form
194+ {
195+ public static void Main()
196+ {
197+ MyForm aForm = new MyForm();
198+
199+ aForm.Width = 350;
200+
201+ Button b = new Button();
202+ b.Left = 15;
203+ b.Top = 20;
204+ b.Width = aForm.Width-30;
205+ b.Height = 30;
206+ b.Text = "A Button";
207+ aForm.Controls.Add(b);
208+
209+ aForm.Text = "A .NET/Mono Windows Forms App";
210+
211+ Application.Run(aForm);
212+ }
213+ }
214+
215+これを次のようにして、Mono でコンパイルします:
216+
217+ mcs -r:System.Windows.Forms MyForm.cs
218+
219+次のようにして実行します:
220+
221+ mono MyForm.exe
222+
223+Mac OS X 上では、Lazarus の実行がそうであるように、現バージョンの Mono も X11 を要求するので、 プログラムを実行するためには X11 ウィンドウ(ターミナルウィンドウではなく)を開いておく必要があります。
224+
225+**5.** もし .NET や Mono から Pascal ライブラリを使用することに関して質問やコメントがあれば、Lazarus フォーラムにそれを投稿してください。
226+
227+---
228+*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](/wiki-contact).*

Back to history