Domanda

Questa domanda è legata a un'altra domanda con cui sono stato lottante: Come accedere all'interfaccia di Corba senza IDL o in ritardo invocano metodi di remozione

Sono davvero strampato su come superare questo errore sul codeset non viene specificato. Sono stato rintracciato nel codice IIOP cercando di capire come è possibile specificare il codeset, e sembra che possa essere specificato con un componente taggato associato al profilo. Essendo sconosciuto con Corba, non so quale sia un componente taggato o quale sia un profilo o come controllarli, ma sospetto che possa essere influenzato dalla creazione di un intercettore oggetto portatile, a quel punto potrei aggiungere un codeset taggato Componente al profilo, se ciò significa qualsiasi cosa. Sto solo andando da quello che posso imparare dal codice IIOP.net e Google.

Qualcuno potrebbe aiutarmi a capire e speriamo di controllare questo? Se il server è una scatola nera e ho bisogno di scrivere un client per chiamare un metodo che emette una stringa, come faccio a dirlo a IIOP.NET quale wokar codeset utilizzare in modo che non mi dia un errore su di esso non specificato. Ho provato overvedvefaultcharsets dal cliente, ma non sembra avere alcun effetto. Il codice di esempio IIOP per quella funzione mostra che viene utilizzato sul lato server.

È stato utile?

Soluzione

This was a real pain to work out, but I got it:

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;
...
    }

Unfortunately in my case the problem remained that the byte ordering was backwards too, so I had to go with an entirely different solution based on just getting bytes back and manually converting them to a string instead of getting string directly.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top