使用PerlNET将perl对象从不同的perl类返回到C#

Dou*_*ebb 9 c# perl activestate pdk

我有两个Perl模块,我想将它们作为对象类型公开给C#.其中一个构造另一个类型的对象,并使用如下所示的方法返回它.我在Type1.dll中包含对Type2.dll的引用,并在C#中引用它们.如代码所示,我可以直接从C#构造一个Type2对象,但是我不能返回由Type1中的方法构造的Type2对象.有任何想法吗?

(交叉发布自http://community.activestate.com/forum/return-perl-object-different-perl-class-c)

C#:

Type1 obj1 = new Type1(); // Works
Type2 test = new Type2(); // Works
Type2 obj2 = obj1.make2(); 
// Fails: System.InvalidCastException: Unable to cast object of type 
// 'PerlRunTime.SV' to type 'Type2' at Type1.make2()
Run Code Online (Sandbox Code Playgroud)

Perl:Type1.pm

package Type1;

use strict;
use Type2;

=for interface
    [interface: pure]
    static Type1();
    Type2 make2();
=cut

sub new {
    my $class = shift;
    return bless {}, $class;
}

sub make2 {
    my $this = shift;
    return Type2->new();
}

1;
Run Code Online (Sandbox Code Playgroud)

Perl:Type2.pm

package Type2;

use strict;

=for interface
    [interface: pure]
    static Type2();
=cut

sub new {
    my $class = shift;
    return bless {}, $class;
}

1;
Run Code Online (Sandbox Code Playgroud)

Tim*_*mwi 2

由于此问题已交叉发布到community.activestate.com并已在那里得到答复,因此我会将答案从那里复制到此处,但我会对其进行修剪,因为我认为它太长了。

主要问题是您编写它的方式Type2不被视为类型,并且调用Type2->new()不会转换为构造函数调用(而是静态方法调用)。

对代码进行以下更改可以解决此问题:

  • 在 Type2.pm 中,更改package Type2package Sample::Type2. 这使得 Type2 成为一个类型,而 Sample 成为一个命名空间。
  • 在 Type1.pm 中,类似地更改package Type1package Sample::Type1.
  • 在 Type1.pm 中,更改use Type2;use namespace "Sample";. 这会将 Type2 作为type导入。

在这些更改之后,发布的 C# 代码可以按要求工作。