Pergunta

Esta questão está relacionada a outra pergunta com a qual tenho lutado: como acessar a interface do CORBA sem Idl ou tardio invocar métodos de remoção

Estou realmente perplexo sobre como passar este erro sobre o codeset não sendo especificado. Eu tenho traçado para o código IIOP tentando descobrir como o codeset pode ser especificado, e parece que ele pode ser especificado com um componente marcado associado ao perfil. Sendo desconhecido com o CORBA, não sei o que é um componente marcado ou o que é um perfil ou como controlá-los, mas suspeito que ele pode ser influenciado criando um interceptor de objeto portátil, em que ponto eu poderia adicionar um codeset marcado componente para o perfil, se isso significa alguma coisa. Eu só estou indo pelo que posso aprender com o código IIOP.NET e Google.

Alguém poderia me ajudar a entender e espero controlar isso? Se o servidor for uma caixa preta e eu precisar escrever um cliente para chamar um método que produza uma string, como eu digo o IIOP.NET O que o Codeset WChar é usado para que não me dê um erro sobre isso não ser especificado. Eu tentei superestimadoFaultCharsets do cliente, mas isso não parecia ter qualquer efeito. O código do exemplo IIOP para essa função mostra-se a ser usado no lado do servidor.

Foi útil?

Solução

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top