如何从CORBA客户端为WChar字符串指定CodeSet

时间:2011-05-18 12:01:20

标签: c# java remoting corba iiop

这个问题与我一直在努力解决的另一个问题有关: 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示例代码显示它在服务器端使用。

1 个答案:

答案 0 :(得分: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;
...
    }

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