0

この質問は、私が苦労してきた別の質問に関連しています: IDL または遅延バインドされたリモート呼び出しメソッドなしで CORBA インターフェイスにアクセスする方法

CodeSet が指定されていないというこのエラーを回避する方法について、私は本当に困惑しています。CodeSet を指定する方法を理解しようとして IIOP コードをトレースしてきましたが、プロファイルに関連付けられたタグ付きコンポーネントで指定できるようです。CORBA に慣れていないので、タグ付きコンポーネントとは何か、プロファイルとは何か、またはそれらを制御する方法はわかりませんが、ポータブル オブジェクト インターセプターを作成することによって影響を受ける可能性があるのではないかと考えています。その時点で、タグ付き CodeSet を追加できます。それが何かを意味する場合は、プロファイルへのコンポーネント。私は、IIOP.NET コードと Google から学べることだけを考えています。

誰かがこれを理解し、できればこれを制御するのを手伝ってくれませんか? サーバーがブラック ボックスで、文字列を出力するメソッドを呼び出すクライアントを作成する必要がある場合、どの WChar CodeSet を使用するかを IIOP.NET に指示して、指定されていないというエラーが発生しないようにする方法を教えてください。クライアントから OverrideDefaultCharSets を試しましたが、効果がないようです。その関数の IIOP サンプル コードは、サーバー側で使用されていることを示しています。

4

1 に答える 1

0

これを解決するのは本当に苦痛でしたが、私はそれを手に入れました:

class MyOrbInitializer : omg.org.PortableInterceptor.ORBInitializer
{
    public void post_init(omg.org.PortableInterceptor.ORBInitInfo info)
    {
        // Nothing to do
    }

    public void pre_init(omg.org.PortableInterceptor.ORBInitInfo info)
    {
        omg.org.IOP.Codec codec = info.codec_factory.create_codec(
            new omg.org.IOP.Encoding(omg.org.IOP.ENCODING_CDR_ENCAPS.ConstVal, 1, 2));
        Program.m_codec = codec;
    }
}


class Program
{
    public static omg.org.IOP.Codec m_codec;

    static void Main(string[] args)
    {
        IOrbServices orb = OrbServices.GetSingleton();
        orb.OverrideDefaultCharSets(CharSet.UTF8, WCharSet.UTF16);
        orb.RegisterPortableInterceptorInitalizer(new MyOrbInitializer());
        orb.CompleteInterceptorRegistration();
...
        MarshalByRefObject objRef = context.resolve(names);
        string origObjData = orb.object_to_string(objRef);
        Ch.Elca.Iiop.CorbaObjRef.Ior iorObj = new Ch.Elca.Iiop.CorbaObjRef.Ior(origObjData);
        CodeSetComponentData cscd = new CodeSetComponentData(
            (int)Ch.Elca.Iiop.Services.CharSet.UTF8,
            new int[] { (int)Ch.Elca.Iiop.Services.CharSet.UTF8 },
            (int)Ch.Elca.Iiop.Services.WCharSet.UTF16,
            new int[] { (int)Ch.Elca.Iiop.Services.WCharSet.UTF16 });
        omg.org.IOP.TaggedComponent codesetcomp = new omg.org.IOP.TaggedComponent(
            omg.org.IOP.TAG_CODE_SETS.ConstVal, m_codec.encode_value(cscd));
        iorObj.Profiles[0].TaggedComponents.AddComponent(codesetcomp);
        string newObjData = iorObj.ToString();
        MarshalByRefObject newObj = (MarshalByRefObject)orb.string_to_object(newObjData);
        ILicenseInfo li = (ILicenseInfo)newObj;
...
    }

残念ながら、私の場合、バイトの順序も逆になっているという問題が残っていたため、文字列を直接取得するのではなく、バイトを取得して手動で文字列に変換するというまったく異なるソリューションを使用する必要がありました。

于 2011-05-18T16:47:42.840 に答える