سؤال

هذا السؤال يتعلق بسؤال آخر كنت تكافح: كيفية الوصول إلى واجهة Corba بدون IDL أو طرق التحكم في الدعوات في وقت متأخر

أنا حقا ركوب حقا حول كيفية تجاوز هذا الخطأ حول الرموز غير المحدد. لقد تم تتبعها في التعليمات البرمجية العالمية التي تحاول معرفة كيفية تحديد الرموز، ويبدو أنه يمكن تحديده مع مكون موسم مرتبط بالملف الشخصي. كونها غير مألوفة مع Corba، لا أعرف ما هو عنصر الموسومات هو أو ما هو ملف تعريف أو كيفية التحكم فيه، لكنني أظن أنه قد يتأثر بإنشاء اعتراض كائن محمول، عند نقطة يمكنني إضافة رموز علامة مميزة مكون إلى الملف الشخصي، إذا كان هذا يعني أي شيء. أنا فقط الذهاب بما يمكنني تعلمه من رمز IIOP.NET وجوجل.

هل يمكن لشخص ما الرجاء مساعدتي في فهم ونأمل السيطرة على هذا؟ إذا كان الخادم عبارة عن صندوق أسود وأحتاج إلى كتابة عميل لاستدعاء الطريقة التي تخرج السلسلة، كيف يمكنني أن أقول IIOP.NET ما رموز الرموز التي تستخدمها حتى لا تعطيني خطأ حول كونها غير محددة. حاولت تجاوز الجلاد من العميل، لكن هذا لم يكن لديه أي تأثير. يعرض نموذج التعليمات البرمجية المثبت في هذه الوظيفة التي يتم استخدامها على جانب الخادم.

هل كانت مفيدة؟

المحلول

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top