![](/img/trans.png)
[英]How do I raise an event in FakeItEasy for an event based on a custom delegate?
[英]How do I raise an event in a PerlNet module?
我使用 PDK 7.3 作为开发工具,用于开发同时使用 .NET 和 Perl 的应用程序。
我想将 Perl 构建到与 .NET 兼容的 dll 中,并且此模块可以引发 Z303CB0EF9EDB9082AZD61BBBE58 应用程序可以处理的事件。
我找不到任何关于它的文档。 据我所知,PDK 7.3 不支持实现委托。
这是真的? 我有什么选择吗?
我给 ActiveState 公司的 Jan Dubois 写了一封 email。 他提出了一种实现回调机制的方法。
希望这有帮助。
============================================
嗨,明,
您可以在 PerlNET 中很好地实现委托,只是不能在其中声明新的委托类型。
我附上了一些在 Perl 中定义委托的示例代码,然后将其传递给 C#。 您需要将这些部分分成单独的文件并手动编译它们; 该代码是从一些回归测试中删除的,并且您将没有测试工具的 rest 来按原样运行它。 (看起来格式也被砍了一点,但代码的意图应该还是很清楚的)。
干杯,
-一月
#!./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);
}
=======================P.pm =====================
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.