Cómo acceder a la interfaz CORBA sin IDL o métodos de invocación remota de invocación tardía

Hemos estado utilizando un "Puente de Licencia COM" de SAP para acceder a su servidor de licencias y consultar la clave de hardware de un sistema mediante programación (para reutilizar sin licencia propia). Esto funcionó bien en SAP Business one Versiones 2007A, 2007B y 8.8, pero en 8.81 parecen haber actualizado su interfaz CORBA sin actualizar el contenedor COM porque ahora tenemos excepciones de memoria cuando intentamos llamar a la función GetHardwareKey.

Así que descargué IIOP.NET y comencé a tratar de escribir mi propia interfaz. Nunca me gustó ese contenedor COM de todos modos. Pero me encontré con mi antiguo enemigo de la comunicación remota .NET: la incapacidad de invocar un método remoto sin tener una interfaz común definida tanto en el servidor como en el cliente. Intenté usar el compilador IDL a CLS incluido con IIOP.NET, pero sigo recibiendo errores sobre la incompatibilidad de la interfaz (SAP no proporcionó un archivo IDL). No sé cómo IIOP y CORBA determinan si una interfaz es compatible. Pero incluso intenté depurar el código IIOP.NET y forzarlo a ejecutar el método a pesar de la incompatibilidad, pero recibí una cadena vacía en lugar de la clave de hardware que quería.

Mi siguiente paso es tratar de implementar un servidor de licencias falso y examinar las solicitudes que llegan del cliente de producción con la esperanza de identificar lo que ellosdeberí parece, pero no cuento con mucho éxito teniendo en cuenta la dificultad que he tenido para mirar las entrañas de la comunicación remota .NET ya.

Mi verdadero problema es cómo obtener o generar la clave de hardware de SAP Business One, pero las preguntas derivadas de eso incluyen:

¿Cómo reflexiono o consulto información sobre una interfaz CORBA? Puedo usar el método de lista de la clase NamingContext para recuperar una lista de objetos disponibles, pero no veo si hay una manera de consultar los métodos disponibles en un objeto. ¿Puedo invocar dinámicamente métodos de comunicación remota .NET sin tener una interfaz? Veo que hay algo llamado DII para invocar dinámicamente CORBA, pero no veo cómo usarlo desde IIOP.NET. ¿Puedo invocar métodos remotos .NET con solo un delegado o una interfaz incompleta? Intenté usar la palabra clave dinámica, pero no pude invocar un método en mi objeto remoto MarshalByRef ... Creo que dijo que el método no existía en mi instancia MarshalByRef o algo así. Sin embargo, solo he intentado esto a través de IIOP.NET (me pregunto si funciona para la comunicación remota .NET normal). ¿Cómo creo o inspecciono instancias de mensajes en el marco remoto de .NET? ¿Puedo enviar o recuperar mensajes remotos directamente, sin pasar por los servidores proxy subyacentes?

Editar Logré hacer que IIOP.NET / CORBA creyera que tenía una interfaz compatible aplicando el atributo 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);
}

Pero todavía obtengo un resultado de cadena vacía.

Edit 2: Después de un poco más de experimentación y depuración, descubrí que los mensajes de respuesta contienen los datos que estoy buscando, pero no se analizan correctamente en los valores del cliente, probablemente debido a mi mala definición de interfaz. Esperar que la depuración en el proceso de respuesta me ayude a descubrir cómo corregir mi interfaz. Curiosamente, lo primero que analiza de la respuesta es un valor de cuadro nulo, que no parece correcto para un parámetro "fuera de cadena".

Editar 3: He descubierto que necesito aplicar atributos de cadena a los parámetros como este para evitar que sean tratados como valores encuadrados:

void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);

Pero a pesar del atributo WideChar, recibo un error acerca de que CodeSet no admite WChar o algo así. Me estoy poniendoDe Verda cerca de resolver esto.

Editar 4: Estoy perplejo de cómo configurar el conjunto de códigos para WChar. Si no lo configuro, recibo un error: "WChar Codeset no especificado o no es compatible". porque el servidor ha devuelto una cadena unicode sin anular el juego de caracteres predeterminado. No puedo encontrar ninguna forma de anular eso del cliente. Traté de llamar:

omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
    CharSet.UTF8, WCharSet.UTF16);

Pero eso no parece tener ningún efecto en el cliente final. El código de ejemplo muestra que se llama al servidor. Pero no escribí el servidor, así que no puedo controlar eso. ¿Es mi única opción reescribir el código IIOP.NET para mis propios fines y obligar a un WChar CodeSet predeterminado a entrar en vigor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta