3

私のスコープ:2つのアプリ用のCORBAソリューションを作成しようとしています。1つは.NET側(サーバー)で、もう1つはPython(クライアント)です。サーバーとIDLの生成にはIIOPNetを使用し、スタブの生成とクライアント呼び出しにはOmniORBpyを使用しています。一般に、典型的な例であるAdderのような単純な呼び出しで機能します。しかし、aiがカスタムクラスでメソッドを呼び出そうとすると、機能しません。

クライアントから呼び出されるサーバー側(オブジェクトの削除)にこのクラスがあります:

public class MyRemoteObject : MarshalByRefObject
{
    public override object InitializeLifetimeService()
    {
        return null;
    }

    public bool DoSomething(InterfaceRequest requestData)
    {
        return true;
    }

}

入力パラメータクラスタイプは、サーバー側で次のように宣言されます(非常に単純です)。

[Serializable]    
public class InterfaceRequest
{
    public int SiteId;
    public int UserId;
}

CLSIDLGeneratorを使用してIDLを生成し、後で「omniidl -bpython -CPython ...」のようなPythonスタブを、ここですべてがOKになるまで生成します。

したがって、サーバー(VSデバッグ環境)を起動し、クライアントコードでサービス名を解決し、リモートオブジェクトを正常に絞り込み、要求オブジェクトを作成しますが、これを実行しようとすると、次のようになります。

request = InterfaceRequest()
request.SiteId = 1
request.UserId = 3

result = remoteObj.DoSomething(request) 

Pythonは警告なし、例外なし、あらゆる種類のメッセージで爆発します(omniORB構成ファイルのトレースラベルを最高[40]に更新しましたが、何もトレースされていません)、単にクラッシュします、私はたくさんのことを試しましたそして私はいつも同じ結果を得る。もちろん、問題はパラメータに関連しています(私は推測します)。

私は次のようにクライアント側を実行しています: python client.py -ORBInitRef NameService = corbaname :: localhost:8087

(私の最後のアプローチ:Pythonオブジェクト参照アーキテクチャと値によって渡された適合値型パラメーターは、ある時点で一致していません)

技術の詳細:NET 4.0、IIOPNet(最後)、Python 2.6、omniORB-4.1.5、omniORBpy-3.5。

すべての助けに感謝します、私はこれに少し立ち往生しています、ありがとう。


はい、MyRemoteObject用に生成されたIDLは次のとおりです:....。

module module1 {
module module2 {
module module3 {
module module4 {

interface MyRemoteObject {

boolean TestConnection(in double value) 
raises (::Ch::Elca::Iiop::GenericUserException);

bool DoSomenthing(in ::module1::module2::module3::InterfaceRequest requestData) 
raises (::Ch::Elca::Iiop::GenericUserException);
};

....。

しかし、これについて言及したので、同じファイル(myRemoteObject.idl)に、InterfaceRequestタイプを表す構造がありますが、次のように空であることに気付きました。

module module1 {
module module2 {
module module3 {

valuetype InterfaceRequest;

};
};
};

そしてもちろん、私はそのIDLを適切なコンテンツで別の場所に生成します。

valuetype InterfaceRequest {
public long SiteId;
public long UserId;
};

奇妙なことに、私がこのようなものを生成する順序は重要ですか?、明らかにここに何か問題がありますか?

最後に、これらのいくつかのクラス(リモートおよびパラメータータイプ)のPythonスタブは次のようになります。

class _objref_MyRemoteObject (CORBA.Object):
    _NP_RepositoryId = MyRemoteObject._NP_RepositoryId

    def __init__(self):
        CORBA.Object.__init__(self)

    def TestConnection(self, *args):
        return _omnipy.invoke(self, "TestConnection", _0_module1.module2.module3.module4.MyRemoteObject._d_TestConnection, args)

    def DoSomething(self, *args):
        return _omnipy.invoke(self, "DoSomething", _0_module1.module2.module3.module4.MyRemoteObject._d_DoSomething, args)

    __methods__ = ["TestConnection", "DoSomething"] + CORBA.Object.__methods__

そしてInterfaceRequest:

class InterfaceRequest (_0_CORBA.ValueBase):
    _NP_RepositoryId = "IDL:module1/module2/module3/InterfaceRequest:1.0"

    def __init__(self, *args, **kwargs):
        if args:
            if len(args) != 2:
                raise TypeError("InterfaceRequest() takes 2 arguments "
                                "(%d given)" % len(args))
            self.SiteId = args[0]
            self.UserId = args[1]
        if kwargs:
            self.__dict__.update(kwargs)

したがって、IDLが最後に完全に正しくない場合でも(推測するだけで)、Pythonスタブは適切なコンテンツと適切なパスで生成されます。

助けてくれてありがとう(私は本名を変更しました、IDは関係ありません)そしてとても大きな投稿について申し訳ありません。

4

1 に答える 1

1

IDLCompiler によって生成されたインターフェイス スタブを追加するのを忘れたと思います。

public class MyRemoteObject : MarshalByRefObject, module1.module2.module3.MyRemoteObject
{
    public override object InitializeLifetimeService()
    {
        return null;
    }

    public bool DoSomething(InterfaceRequest requestData)
    {
        return true;
    }    
}

以下のルールを使用して、C# で valuetype を実装する必要があります。

  • クラス XYZImpl を実装しました。ここで、XYZ は valuetype の型名です。
  • XYZImpl は抽象クラス XYZ から継承します (このクラスは IDLToCLSgenerator によって生成されます)
  • XYZImpl は XYZ と同じネームスペースにあります
  • XYZImpl はシリアライズ可能です
  • XYZImpl には、パラメーターのないパブリック コンストラクターがあります。
  • XYZImpl は抽象的ではありません
  • XYZImpl は、継承されたすべての抽象メソッドとプロパティを実装します Link

覚えておいてください、次のようにして IIOPServerChannel を開く必要があります。

int port = 0;
IiopChannel chan = new IiopChannel(port);
ChannelServices.RegisterChannel(chan);
于 2011-08-31T17:38:51.020 に答える