0

这个问题与我一直在努力的另一个问题有关: How to access CORBA interface without IDL or late-bound invoke remoting methods

我真的很难过如何克服这个关于未指定 CodeSet 的错误。我一直在追踪 IIOP 代码,试图弄清楚如何指定 CodeSet,看起来它可以使用与配置文件关联的标记组件来指定。由于不熟悉 CORBA,我不知道标记组件是什么或配置文件是什么或如何控制它们,但我怀疑它可能会受到创建可移植对象拦截器的影响,此时我可以添加一个标记的 CodeSet配置文件的组件,如果这意味着什么。我只是从 IIOP.NET 代码和 Google 中学到的东西。

有人可以帮我理解并希望控制它吗?如果服务器是一个黑匣子,我需要编写一个客户端来调用一个输出字符串的方法,我如何告诉 IIOP.NET 使用什么 WChar CodeSet,这样它就不会给我一个关于它未指定的错误。我从客户端尝试了 OverrideDefaultCharSets,但这似乎没有任何效果。该函数的 IIOP 示例代码显示它在服务器端使用。

4

1 回答 1

0

这是一个真正的痛苦,但我明白了:

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

不幸的是,在我的情况下,问题仍然是字节顺序也是向后的,所以我不得不采用一个完全不同的解决方案,该解决方案基于只取回字节并手动将它们转换为字符串而不是直接获取字符串。

于 2011-05-18T16:47:42.840 回答