9

オブジェクト型として C# に公開したい 2 つの Perl モジュールがあります。それらの 1 つは、他の型のオブジェクトを構築し、以下に示すメソッドを使用してそれを返します。Type1.dll に Type2.dll への参照を含め、C# で両方を参照しています。コードが示すように、Type2 オブジェクトを C# から直接作成できますが、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()

パール: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;

パール:Type2.pm

package Type2;

use strict;

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

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

1;
4

2 に答える 2

2

これはcommunity.activestate.comに相互投稿され、そこで回答されているので、そこから回答をここにコピーしますが、長すぎると思うので削除します。

主な問題は、あなたが書いた方法がtypeType2と見なされず、呼び出しがコンストラクター呼び出しに変換されないことです (ただし、静的メソッド呼び出し)。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# コードは、これらの変更後に必要に応じて機能します。

于 2010-05-10T16:28:29.830 に答える
1

また、次のような 1 つのファイルを作成できることもわかりました。

package Type2;

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

require Type2;


package Type1;
use Type2;

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

次に、Type1.pm および Type2.pm ファイルは以前と同じですが、インターフェイス POD はありません。このセットアップでは、plc は両方のクラスを含む 1 つの dll を作成し、Type1 クラスは Type2 のインスタンスを作成して返すことができます。

Type1 クラスと Type2 クラスはレガシー ライブラリの一部であり、.NET 固有の大幅な変更を加えずに C# コードで利用できるようにしたいため、これは実際には私にとってより便利であることが判明しました。C# アセンブリ用に 1 つの pm ファイルを作成しました。その中に、従来のライブラリ メソッドにアクセスするためのインターフェイス定義と、プロパティ用の .NET 固有のメソッドの束を含め、複雑な Perl ハッシュ/配列データ構造の戻り値をHashtable および Array/ArrayList データ構造。

于 2010-05-10T21:12:27.723 に答える