Как указать кодовой доступ для вечерной строки из клиента CORBA
Вопрос
Этот вопрос связан с другим вопросом, с которым я борюсь: Как получить доступ к интерфейсу CORBA без Методы удаления ссылок IDL или поздней связанной связи
Я действительно озадачен тем, как пройти прошедшую ошибку о кодоме, не указанном. Я отслеживаю в код IIOP, пытаясь выяснить, как можно указать кодовой доступ, и похоже, что он может быть указан с меткой компонентом, связанным с профилем. Будучи незнакомым с CORBA, я не знаю, какое помеченное компонент или какой профиль является или как их контролировать, но я подозреваю, что оно может зависеть от создания портативного перехвата объекта, в какой момент я могу добавить с меткой CodeSet Компонент к профилю, если это значит что-нибудь. Я просто делаю то, что я могу учиться у IIOP.NET код и Google.
Может кто-нибудь, пожалуйста, помогите мне понять и, надеюсь, контролируют это? Если сервер является черным ящиком, и мне нужно написать клиент, чтобы вызвать метод, который выводит строку, как мне сказать IIOP.Net, какой WCROR CODESET использовать, чтобы он не дает мне ошибку об этом неуказанным. Я попытался переопределитьefaultCharsets от клиента, но, похоже, не имеет никакого эффекта. Код пример IIOP для этой функции показывает его, используемый на стороне сервера.
Решение
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.