Ayuda SAP

COM Formato antiguo o tipo de biblioteca no válida

Buen día para todos, espero que se encuentren muy bien, quisiera en esta ocasión pedir su colaboración, ya que tengo desarrollado un servicio de windows, que se encarga de consumir un webservice para consultar información de unas facturas y posteriormente traer esa información, para actualizar unos campos definidos por usuario de la factura.
El servicio funciona muy bien, lo que sucede es que cuando lleva muchas horas ejecutándose, o días, empieza salir el siguiente error:

No se puede convertir el objeto COM del tipo ‘SAPbobsCOM.CompanyClass’ al tipo de interfaz ‘SAPbobsCOM.Company’. Ocurrió un error de operación debido a que la llamada QueryInterface en el componente COM para la interfaz con IID ‘{3BA8DAED-5B33-4CE4-A4B8-B4308D86E524}’ generó el siguiente error: Formato antiguo o tipo de biblioteca no válida. (Excepción de HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))…

realizo el
System.Runtime.InteropServices.Marshal.ReleaseComObject(businessObject); después de que hago un update() en cada documento y cuando ya termino de procesar el bloque de facturas y no voy a usar más el objeto businessObject hago un

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(businessObject);
GC.Collect();

aún así haciendo esto, no consigo que deje de aparecerme el error de Formato antiguo o tipo de biblioteca.

Agradezco de su colaboración, si alguien ha podido resolver este problema, estaré muy agradecido.

1 me gusta

Tu sistema corre en un arquitectura x64 o x86, creo que a mi me apareció un error similar alguna ocasión, el sistema tiene guardados los objetos COM en alguna locación dependiendo de la arquitectura, yo lo que tuve que hacer para que mi programa corriera bien fue configurarlo para x86 aunque mi servidor fuera de x64.

Que otras utilidades le has dado al SDK?

Saludos.

Hola @Fernando7 gracias por tu respuesta, el servicio lo tengo como Any CPU, voy a intentar compilando solo en x86 para ver si resulta.

Utilidades tengo muchas, he realizado diferentes automatizaciones, procesos de picking, traslados, salidas, entradas de mercancías, envío de correos automáticos, pedidos de venta, facturas de deudores, addons para incluir funcionalidades a SAP…

1 me gusta

Mira encontre estas páginas donde parece que hablan de ese error, espero puedas solucionarlo.

h_tps://support.boyum-it.com/hc/es-419/articles/202368066-Obtengo-un-error-con-el-siguiente-texto-Imposible-cambiar-el-tipo-de-objeto-COM-de-tipo-SAObobsCOM-CompanyClass-a-tipo-interface-SAPbobsCOM-ICompany-

Hay alguna forma en que pueda contactarte, creo que aquí en el foro no se pueden mandar mensajes privados, y quisiera intercambiar información contigo que eres SDK Developer.

1 me gusta

Primero deberías probar con el tema de cambiar el proyecto a x86 y verifica que tengas la misma versión de los dll’s, y asegúrate de tener instalada siempre los dll’s tanto para x86, como para x64.
Después podrías tratar de ver específicamente en que dato es que sucede el error, por si se trata de algo de datos.

1 me gusta

Claro que sí, mi correo es mi nombre de usuario más el dominio de gmail. me avisas a ver en que nos ayudamos.

Hola @Willy_Caldero muchas gracias, voy a revisar esos puntos, porque no tengo instaladas las 2 dll, al parecer solo la de x86.

No es prescindible tener las dos, con que te asegures que arquitectura estas trabajando te recomiendo ponerla en el proyecto asi, me a pasado que con el ANY CPU marque errores. Creo por ahi va el problema la verdad.

OJO: tampoco te afecta tener las 2 APIS instaladas. Es como te acomodes mejor.

Muchas gracias por su ayuda, aún no se ha podido resolver el problema, compilé el programa en x86 e instalé el servicio de windows así en el servidor, pero después de 1 día de estar ejecutándose, me marca:

No se puede convertir el objeto COM del tipo ‘SAPbobsCOM.CompanyClass’ al tipo de interfaz ‘SAPbobsCOM.Company’. Ocurrió un error de operación debido a que la llamada QueryInterface en el componente COM para la interfaz con IID ‘{3BA8DAED-5B33-4CE4-A4B8-B4308D86E524}’ generó el siguiente error: Formato antiguo o tipo de biblioteca no válida. (Excepción de HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))

No sé que otra cosa puedo hacer… hago GC.Collect() pero nada, hago también oCompany.Disconnect() pero no ayuda, antes se vuelve como más lento o pesado.

Yo tengo una clase llamada conexión, que hace como el inicio del objeto oCompany, para poder usar el objeto en cualquier parte del código, es como una clase compartida o publica de tipo (sealed), ella al parecer siempre queda como conectada así el servicio termine su ejecución, puede ser eso? les paso bien la arquitectura como lo estoy usando?

Estas trabajando con SQL o HANA?

Estoy trabajando con HANA.

podrias compartir el codigo cuando llamas al Company, o cuando lo seteas, el GC.collect solo sirve para limpiar memoria, no lo recomiendo

Claro que sí
Cuando inicia el servicio, hace esto:
En el evento OnTimer,
Estructuras.Respuesta FacturasEnviadas = await Transacciones.EnviarFacturas.postFactura(compania);

En la Clase EnviarFacturas método postFactura me conecto de la siguiente manera:

List<Estructuras.Facturas> Documentos = await Data.EnviarFactura.getFacturas(ConfigurationManager.AppSettings.Get("TipoDb"),
                                                                BaseDatos);
if (Documentos.Count != 0)
{
  try{
  Conexion.Iniciar();
  Conexion.oCompany.Server = ConfigurationManager.AppSettings.Get("Server");
  Conexion.oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANADB;
  Conexion.oCompany.CompanyDB = BaseDatos;
  Conexion.oCompany.UserName = ConfigurationManager.AppSettings.Get("UserName");
  Conexion.oCompany.Password = ConfigurationManager.AppSettings.Get("Password");
  Conexion.oCompany.DbUserName = 
  ConfigurationManager.AppSettings.Get("DbUserName");
  Conexion.oCompany.DbPassword = 
  ConfigurationManager.AppSettings.Get("DbPassword");
  Conexion.oCompany.language = SAPbobsCOM.BoSuppLangs.ln_Spanish_La;
  if (Conexion.oCompany.Connect() == 0)
  {
      SAPbobsCOM.Documents businessObject;
      foreach (var doc in Documentos)
      {
         businessObject = (SAPbobsCOM.Documents)Conexion.oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInvoices);
         // aquí hago otros procesos con cada documento...
         if (businessObject.GetByKey(doc.DocEntry))
         {
              businessObject.UserFields.Fields.Item("U_FEL_Respuesta").Value = respp2.Respuesta;
              businessObject.UserFields.Fields.Item("U_FEL_Estado").Value = respp2.Estado;
              if (businessObject.Update() == 0)
              {
                  // otros procesos etc...
              }
              //Cada que hago un update ejecuto esto:
              System.Runtime.InteropServices.Marshal.ReleaseComObject(businessObject);
          }
       }
       // Cuando termino de recorrer el foreach, ejecuto lo siguiente:
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(businessObject);
       GC.Collect();
   }

La clase conexión tiene lo siguiente:

Ven algo que pueda estar haciendo mal en el código? y perdón, corrijo, este error se me presenta tanto en SAP HANA como con SQL, no importa que motor de base de datos use, me pasa da el mismo error.

no veo nada que pudiera causar el error, probaste usando un start transaccion y usar el oCompany.Disconnect() pero no dentro del ciclo, solo cuando termines de ejecutar todo

Esto del Star Transaction es como tal en la base de datos verdad?

Hola @leonardo70338, según tengo entendido yo, sí.

De hecho algún tiempo tuve el error de que no podía realizar una acción en la DI API porque “Ya había una transacción en progreso”, y tienes que agregarle el rollback y el commit. Si no, no te deja intentar otra modificación.

Le hice una trampa al servicio sin saberlo y ya está funcionando, pero solo funciona para hana, porque para SQL da un error distinto y se detiene el servicio de windows, hice lo siguiente:

En la clase conexión, les había mostrado que tenía un método llamado Iniciar, pero añadí otro método llamado Finalizar así:
image
En el evento OnTimer del servicio, ejecuto el método Iniciar de esta clase, antes de ejecutar el método que llama la información de las facturas, para cuando termina de ejecutarse el método de las facturas y hacer su proceso completo, ejecuto el método Conexion.Finalizar();

En el visor de eventos me sale un error cada tanto tiempo, pero al menos el servicio se reinicia y continúa funcionando:

y me muestra estos dos AppCrash

Pero para el servicio con SQL al parecer el servicio sí se detiene completamente aunque lo tenga configurado como reinicio automático image

Agradezco si tienen alguna otra idea.