我有两个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()

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;

Perl:Type2.pm
package Type2;

use strict;

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

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

1;

最佳答案

由于此问题已交叉发布到community.activestate.com并在此处得到了回答,因此我将答案从那里复制到此处,但是我将其缩小,因为我认为它太长了。

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

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

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

  • 这些更改后,已发布的C#代码将按要求工作。

    关于c# - 使用PerlNET将Perl对象从其他Perl类返回到C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2685417/

    10-12 23:57