Pregunta

Esta pregunta está relacionada con otra pregunta con la que he estado luchando: Cómo acceder a la interfaz de corba sin IDL o métodos de remoto de invocaciones tardíos

Estoy realmente perplejo de cómo superar este error sobre el que no se está especificado. He estado rastreando el código IIOP que intenta averiguar cómo se puede especificar el códigoset, y parece que podría especificarse con un componente etiquetado asociado con el perfil. Siendo desconocido con CORBA, no sé qué es un componente etiquetado o qué perfil es o cómo controlarlos, pero sospecho que puede verse influenciado creando un interceptor de objeto portátil, momento en el que podría agregar un códigos de códigos etiquetados Componente al perfil, si eso significa algo. Solo voy por lo que puedo aprender del código IIOP.NET y Google.

¿Podría alguien por favor ayudarme a entender y con suerte controlar esto? Si el servidor es una caja negra y necesito escribir un cliente para llamar a un método que emite una cadena, ¿cómo le digo a IIOP.NET qué códigos WWCAR para usar, por lo que no me da un error al ser no especificado? Intenté los SobreverdeFaultCharsetsets del cliente, pero eso no parecía tener ningún efecto. El código de muestra IIOP para esa función le muestra que se está utilizando en el lado del servidor.

¿Fue útil?

Solución

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top