2009-03-05 6 views
0

私は、.NETとPerlの両方を使用してアプリケーションを開発するための開発ツールとしてPDK 7.3を使用しています。PerlNetモジュールでイベントを発生させるにはどうすればよいですか?

.NET互換のDLLにPerlをビルドしたいと思います。このモジュールは、.NET GUIアプリケーションが処理できるイベントを発生させることができます。

私はそれに関するドキュメントを見つけることができません。私が知る限り、PDK 7.3は代理人の実装をサポートしていません。

これは本当ですか?私はオプションがありますか?

答えて

1

私はActiveState社のJan Duboisにメールを送りました。彼は、コールバックメカニズムを実装する方法を提案しました。

このヘルプが必要です。

=========================

あなたは PerlNETでうまくデリゲートを実装することができます

こんにちはミンは、あなたはそれで新しいデリゲート型を宣言することはできません。

Perlでデリゲートを定義し、後でそれをC#に渡すサンプルコードをいくつか添付しました。個々のファイルに分割し、手動でコンパイルする必要があります。コードはいくつかの回帰テストからリッピングされ、テストハーネスの残りの部分をそのまま実行することはありません。 (書式もちょっと切ったように見えますが、コードの意図はまだ明らかです)。

乾杯、-JAN

#!./perl -w 

# Define some properties and fields in perl and try to access them. 
print "1..1\n"; 
require 'setup.pl'; 
csc("-target:library DB.cs"); 
cleanup("DB.dll"); 
plc(-target => "library", -out => "P.dll", -r => "DB.dll", "P.pm"); 
csc("test.cs -r:DB.dll -r:P.dll"); 
cleanup("./test.exe"); 
my $res = `./test.exe`; 
print "----\n$res----\n"; 
print "not " unless $res eq <<'EOT'; 
XXX 65 
XXX 66 
XXX 67 
XXX 68 
XXX 69 
XXX 70 
XXX 71 
XXX 4.2 
XXX 4.30000019073486 
XXX 4.4 
XXX a 
XXX 1 
XXX "" 
XXX Hi 
XXX <undef> 
EOT 
print "ok 1\n"; 
__END__ 

======================= test.cs ===== ================

using System; 

class main : IPrint 
{ 
    public static void Main(string[] args) 
    { 
     P p = new P(new main()); 
     DataBase db = new DataBase(); 
     db.Add((byte)65); 
     db.Add((short)66); 
     db.Add((int)67); 
     db.Add((long)68); 
     db.Add((uint)69); 
     db.Add((ushort)70); 
     db.Add((ulong)71); 
     db.Add(4.2D); 
     db.Add(4.3F); 
     db.Add(4.4M); 
     db.Add('a'); 
     db.Add(true); 
     db.Add(false); 
     db.Add("Hi"); 
     db.Add(null); 
     db.Scan(p.handler); 
    } 

    main() {} 

    public void print(string s) { 
     Console.WriteLine(s); 

    } 
} 

======================= DB.cs = ====================

using System; 
using System.Collections; 

public delegate void ProcessItem(Object i); 
public class DataBase : ArrayList { 
    public DataBase() {} 
    public void Scan(ProcessItem handler) { 

     foreach (object o in this) { 
      handler(o); 
     } 
    } 

} 

public interface IPrint { 
    void print(string s); 

} 

=====================================================

package P; 

=for interface 

interface ProcessItem; # a delegate type 
interface IPrint; 
interface System.Object; 

interface P { 
    static P P(IPrint ip); 
    readonly ProcessItem handler; 
    void x(System.Object y); 
    private field IPrint ip; 
} 

=cut 

sub P { 
    my($self, $ip) = @_; 
    $self->{ip} = $ip; 
} 

sub handler { 
    my $self = shift; 
    return ProcessItem->new($self, "x"); 
} 

sub x { 
    my($self, $obj) = @_; 
    $obj = "<undef>" unless defined $obj; 
    $obj = '""' unless length $obj; 
    $self->{ip}->print("XXX $obj"); 
} 

1; 
関連する問題