SBOLicense.idl
пользовали SAP «COM License Bridge» для доступа к их серверу лицензий и программного запроса аппаратного ключа системы (для повторного использования без собственного лицензирования). Это хорошо работало на версиях SAP Business One 2007A, 2007B и 8.8, но в 8.81 они, похоже, обновили свой интерфейс CORBA без обновления оболочки COM, потому что теперь мы получаем исключения из памяти при попытке вызвать функцию GetHardwareKey.
Поэтому я скачал IIOP.NET и начал пытаться написать свой собственный интерфейс. Мне никогда не нравилась эта оболочка COM. Но я столкнулся со своим старым врагом удаленного взаимодействия в .NET - невозможностью вызова удаленного метода без общего интерфейса, определенного как на сервере, так и на клиенте. Я попытался использовать компилятор IDL для CLS, включенный в IIOP.NET, но продолжаю получать ошибки о несовместимости интерфейса (SAP не предоставил файл IDL). Я не знаю, как IIOP и CORBA определяют, совместим ли интерфейс. Но я даже попытался отладить код IIOP.NET и заставить его выполнить метод, несмотря на несовместимость, но получил пустую строку вместо аппаратного ключа, который я хотел.
Мой следующий шаг - попытаться реализовать фальшивый сервер лицензий и изучить запросы, поступающие от рабочего клиента, в надежде определить, что онидолжен похоже, но я не рассчитываю на большой успех, учитывая трудности, с которыми я столкнулся при рассмотрении внутренних функций удаленного взаимодействия .NET.
Моя настоящая проблема заключается в том, как получить или сгенерировать аппаратный ключ SAP Business One, но вытекающие из этого вопросы:
Как отразить или запросить информацию об интерфейсе CORBA? Я могу использовать метод list класса NamingContext для получения списка доступных объектов, но я не вижу, есть ли способ запросить доступные методы для объекта.Могу ли я динамически вызывать методы удаленного взаимодействия .NET без интерфейса? Я вижу что-то под названием DII для динамического вызова CORBA, но я не вижу, как использовать это из IIOP.NET.Могу ли я вызвать методы удаленного взаимодействия .NET только с делегатом или неполным интерфейсом? Я попытался использовать динамическое ключевое слово, но он не смог вызвать метод для моего удаленного объекта MarshalByRef ... Я думаю, он сказал, что метод не существует в моем экземпляре MarshalByRef или что-то в этом роде. Я только попробовал это через IIOP.NET, хотя (интересно, работает ли это для нормального удаленного взаимодействия .NET).Как создать или проверить экземпляры сообщений в платформе удаленного взаимодействия .NET?Могу ли я отправлять или получать удаленные сообщения напрямую, минуя прокси-серверы?Редактировать: Мне удалось заставить IIOP.NET / CORBA поверить, что у меня был совместимый интерфейс, применив атрибут RepositoryID:
[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
void GetHardwareKey(out string hwKey);
}
Но я все еще получаю пустой результат строки.
Изменить 2: После еще нескольких экспериментов и отладки я обнаружил, что ответные сообщения содержат искомые данные, но не анализируются должным образом в значениях клиента, возможно, из-за моего неверного определения интерфейса. Надеясь, что отладка в дальнейшей обработке ответов поможет мне понять, как исправить мой интерфейс. Как ни странно, первое, что он анализирует из ответа, - это пустое значение в штучной упаковке, которое не подходит для параметра «out string».
Изменить 3: Я обнаружил, что мне нужно применять строковые атрибуты к таким параметрам, чтобы они не рассматривались как коробочные значения:
void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);
Но, несмотря на атрибут WideChar, я получаю ошибку по поводу того, что CodeSet не поддерживает WChar или что-то в этом роде. Я получаюдействительно близко к выяснению этого.
Изменить 4: Я поставлен в тупик, как установить кодовый набор для WChar. Если я не установил его, я получаю сообщение об ошибке: «WChar Codeset либо не указан, либо не поддерживается». потому что сервер возвратил строку юникода без переопределения набора символов по умолчанию. Я не могу найти способ переопределить это от клиента. Я пытался позвонить:
omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
CharSet.UTF8, WCharSet.UTF16);
Но это, похоже, не влияет на клиентскую часть. Пример кода показывает вызов этого на стороне сервера. Но я не писал сервер, поэтому я не могу это контролировать. Является ли мой единственный вариант переписать код IIOP.NET для моих собственных целей, чтобы заставить WChar CodeSet по умолчанию вступить в силу?