2011-05-18 102 views
0

这个问题是涉及到另外一个问题与我一直在挣扎指定WCHAR字符串代码组: How to access CORBA interface without IDL or late-bound invoke remoting methods如何从CORBA客户端

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

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

回答

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; 
... 
    } 
在我的情况

不幸的是,问题仍然是字节顺序是倒退了,所以我不得不去与一个完全基于只返回字节并手动将它们转换为字符串而不是直接获取字符串的不同解决方案。