gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:57:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com