Frage

Diese Frage hängt mit einer anderen Frage zusammen, mit der ich gekämpft habe: So erreichen Sie die Corba-Schnittstelle ohne IDL- oder spätgebundene REPOKE-Remotiermethoden

Ich bin wirklich aufgesteckt, wie er diesen Fehler über das Codeset übernimmt, das nicht angegeben wird. Ich bin in den iiOP-Code verfolgt, der versucht, herauszufinden, wie das Codeset angegeben werden kann, und es sieht so aus, als könnte es mit einer mit dem Profil verbundenen gekennzeichneten Komponente angegeben werden. Ich weiß nicht mit Corba, ich weiß nicht, was eine gekennzeichnete Komponente ist oder was für ein Profil ist oder wie man sie steuert, aber ich vermute, dass es durch Erstellen eines tragbaren Objektinterzeptors beeinflusst werden kann, an dem ich einen markierten CodeSet hinzufügen konnte Komponente zum Profil, wenn das alles bedeutet. Ich gehe einfach mit dem, was ich aus dem IIOP.NET-Code und von Google lernen kann.

Könnte mir bitte jemand helfen, dies zu verstehen und hoffentlich zu kontrollieren? Wenn der Server eine Black-Box ist und einen Client schreiben muss, um eine Methode aufzurufen, die eine Zeichenfolge ausgibt, die eine Zeichenfolge ausgibt, wie er denn iiOP.net, welches WARR-Codeset verwendet wird, um zu verwenden, sodass er nicht ein Fehler darstellt, dadurch, dass er nicht näher gesagt ist. Ich habe überschriebene FEULTEFAULTCHARSETS vom Kunden ausprobiert, aber das schien keine Wirkung zu haben. Der IIOP-Beispielcode für diese Funktion zeigt, dass er auf der Serverseite verwendet wird.

War es hilfreich?

Lösung

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top