Как указать строку CodeSet для WChar из клиента CORBA - PullRequest
0 голосов
/ 18 мая 2011

Этот вопрос связан с другим вопросом, с которым я боролся: Как получить доступ к интерфейсу CORBA без IDL или методов удаленного вызова с поздним связыванием

Я действительно озадачен тем, как обойти эту ошибку, если не указан кодовый набор. Я проследил в коде IIOP, пытаясь выяснить, как можно задать CodeSet, и похоже, что он может быть указан с помеченным компонентом, связанным с профилем. Будучи незнакомым с CORBA, я не знаю, что такое помеченный компонент, что это за профиль или как им управлять, но я подозреваю, что на него может повлиять создание переносного объекта-перехватчика, после чего я мог бы добавить помеченный CodeSet компонент к профилю, если это что-то значит. Я просто исхожу из того, что я могу узнать из кода IIOP.NET и Google.

Может ли кто-нибудь помочь мне понять и, надеюсь, контролировать это? Если сервер является черным ящиком, и мне нужно написать клиент для вызова метода, который выводит строку, как мне сообщить IIOP.NET, какой WChar CodeSet использовать, чтобы он не выдавал ошибку об неопределенности. Я попробовал OverrideDefaultCharSets от клиента, но это, похоже, не оказало никакого влияния. Пример кода IIOP для этой функции показывает, что он используется на стороне сервера.

1 Ответ

0 голосов
/ 18 мая 2011

Это была реальная боль, чтобы сработать, но я понял:

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

К сожалению, в моем случае проблема оставалась в том, что порядок следования байтов тоже был обратным, поэтому мне пришлось пойти на совершенно другое решение, основанное на простом возврате байтов и ручном преобразовании их в строку вместо прямого получения строки.

...