MI APLICACION SE CONGELA AL REALIZAR LA INVOCACION DE UNA LIBRERIA

Discussion MI APLICACION SE CONGELA AL REALIZAR LA INVOCACION DE UNA LIBRERIA

  • jueves, 02 de agosto de 2012 3:24
     
      Tiene código

    Hola, estoy desarrollando una aplicación para generar facturas electrónicas y en este punto me encuentro con una situación bastante extraña, me he gastado los cesos pensando ¿que podra ser? sin embargo no logro resolverlo pues simplemente la aplicación deja de funcionar sin enviar ningún error que pueda mostrar, asi que intentare ser muy explicito en mi problema para recibir posibles soluciones o sugerencias que me encaminen a la respuesta que busco.

    estoy desarrollando con C# en Visual Studio 2008 y ocupo una librería  echa en C ++ que me ayuda con el proceso de generar facturas electrónicas, el cual como saben para los comprobantes fiscales digitales por Internet tienen que viajar a un PAC para ser validados y timbrados así que esta librería se encarga de generar el XML y enviarlo a ser validado y timbrado, dicha librería me la provee el PAC con el que estoy realizando el enlace, he de aclarar que ya pedí asesoría en cuanto a este problema  pero no recibo respuesta de parte de el.

    El  uso de esta librería me obliga a utilizar los servicios de invocación de plataforma así que tengo una clase a la cual en el constructor le paso toda la información necesaria que requiere la librería para trabajar ( RFC, DIRECCIONES, NOMBRES, CONCEPTOS  etc... ) realizo los llamados a la librería y a través de un método doy comienzo al proceso de generar la factura.

    En mi solución de Visual Studio al dar F5 compila y correr la aplicación, FUNCIONA DE MARAVILLA (guarda, genera XML, lo valida lo timbra todo excelente). El problema se ha presentado cuando genere el SETUP (release)  y lo lleve a otra computadora, todas las funcionalidades de la aplicación andan de maravilla (reportes, configuración etc..) pero cuando le doy clic al boton "GENERAR FACTURA" que manda los parámetros al constructor de la clase que mencione y activa el método que desata el proceso de enviar los parámetros a las funciones de la dll para que genere el XML lo valide y lo timbre, es allí cuando simplemente la aplicación se congela y sale un aviso "LA APLICACIÓN DEJO DE FUNCIONAR WINDOWS BUSCARA UNA SOLUCIÓN AL PROBLEMA"  dado que el problema se centra especificamente en esa parte de la aplicacion pienso que el problema radica en el uso de esta libreria, he checado tambien cosas basicas como que el usuario sea administrador para que no existan problemas al obtener o manipular la libreria, incluso desactive el control de cuentas  del windows para que dejase de solicitar permisos y simplemente NO FUNCIONA.

    Anexo la clase que recibe mediante el constructor la información para que la librería pueda procesarla.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Data;
    using Telerik.WinControls;
    using Telerik.WinControls.UI;
    using System.IO;
    using System.Collections;
    
    namespace UMBRALLFacturaE.CFD
    {
        public class CFD
        {
            #region LLAMADO LIBRERIA
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_NewW")]
            static extern int VirtualXML_New(String szVersion);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_ProcesaDocumentoW")]
            static extern int VirtualXML_ProcesaDocumento(int p, String csd, String key, String keypwd, String outfile);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_GetValueW")]
            static extern String VirtualXML_GetValue(int p, int value);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_FreeW")]
            static extern void VirtualXML_Free(int p);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetVirtualPACInfoW")]
            static extern void VirtualXML_SetVirtualPACInfo(int p, String szUser, String servidor);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetCiberSATInfoW")]
            static extern void VirtualXML_SetCiberSATInfo(int p, String userCiberPAC, String llaveCiberPAC);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetComprobanteInfoW")]
            static extern void VirtualXML_SetComprobanteInfo(int p, String serie, String folio, String fecha, String tipoDeComprobante, String formaDePago, String subtotal, String descuento, String total, String moneda, String tipoCambio, String condicionesDePago, String metodoDePago, String motivoDescuento);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetComprobanteCFDInfoW")]
            static extern void VirtualXML_SetComprobanteCFDInfo(int p, String noAprobacion, String anoAprobacion);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetComprobanteInfoExW")]
            static extern void VirtualXML_SetComprobanteInfoEx(int p, String LugarExpedicion, String NumCtaPago, String SerieFolioFiscalOrig, String FolioFiscalOrig, String MontoFolioFiscalOrig, String FechaFolioFiscalOrig);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetEmisorInfoW")]
            static extern void VirtualXML_SetEmisorInfo(int p, String szRFC, String szRazonSocial);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetEmisorDomicilioW")]
            static extern void VirtualXML_SetEmisorDomicilio(int p, String calle, String noExterior, String noInterior, String colonia, String localidad, String referencia, String municipio, String estado, String pais, String codigoPostal);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetEmisorExpedidoEnW")]
            static extern void VirtualXML_SetEmisorExpedidoEn(int p, String calle, String noExterior, String noInterior, String colonia, String localidad, String referencia, String municipio, String estado, String pais, String codigoPostal);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddEmisorRegimenFiscalW")]
            static extern void VirtualXML_AddEmisorRegimenFiscal(int p, String regimen);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetReceptorInfoW")]
            static extern void VirtualXML_SetReceptorInfo(int p, String szRFC, String szRazonSocial);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetReceptorDomicilioW")]
            static extern void VirtualXML_SetReceptorDomicilio(int p, String calle, String noExterior, String noInterior, String colonia, String localidad, String referencia, String municipio, String estado, String pais, String codigoPostal);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddConceptoW")]
            static extern void VirtualXML_AddConcepto(int p, String cantidad, String unidad, String descripcion, String valorUnitario, String importe, String noIdentificacion);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddInformacionAduaneraW")]
            static extern void VirtualXML_AddInformacionAduanera(int p, String fecha, String numero, String aduana);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddinstEducativasW")]
            static extern void VirtualXML_AddinstEducativas(int p, String CURP, String autRVOE, String nivelEducativo, String nombreAlumno, String rfcPago);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetImpuestosInfoW")]
            static extern void VirtualXML_SetImpuestosInfo(int p, String totalImpuestosTrasladados, String totalImpuestosRetenidos);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddRetencionW")]
            static extern void VirtualXML_AddRetencion(int p, String impuesto, String importe);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddTrasladoW")]
            static extern void VirtualXML_AddTraslado(int p, String impuesto, String tasa, String importe);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetImpuestosLocalesInfoW")]
            static extern void VirtualXML_SetImpuestosLocalesInfo(int p, String TotaldeTraslados, String TotaldeRetenciones);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddImpuestoLocalRetenidoW")]
            static extern void VirtualXML_AddImpuestoLocalRetenido(int p, String ImpLocRetenido, String TasadeRetencion, String Importe);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddImpuestoLocalTrasladadoW")]
            static extern void VirtualXML_AddImpuestoLocalTrasladado(int p, String ImpLocTrasladado, String TasadeTraslado, String Importe);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_AddDonatariasW")]
            static extern void VirtualXML_AddDonatarias(int p, String fechaAutorizacion, String noAutorizacion);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetDllPathW")]
            static extern void VirtualXML_SetDllPath(int p, String DllPath);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetMetodoW")]
            static extern void VirtualXML_SetMetodo(int p, String Metodo);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_GetValueInFileW")]
            static extern void VirtualXML_GetValueInFile(int p, int value, String file);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_ProcessFileW")]
            static extern void VirtualXML_ProcessFile(String szFile);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_CheckFileW")]
            static extern int VirtualXML_CheckFile(String szFile);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetComprobanteFechaW")]
            static extern void VirtualXML_SetComprobanteFecha(int p, String fecha);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetLogFileW")]
            static extern void VirtualXML_SetLogFile(int p, String file);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_SetFlagsW")]
            static extern void VirtualXML_SetFlags(int p, int flags);
    
            [DllImport("VirtualXML.dll", CharSet = CharSet.Unicode, EntryPoint = "VirtualXML_ShowValueW")]
            static extern void VirtualXML_ShowValue(int p, int lValue, String title);
            
    
            #endregion
    
             
            DataTable dttComprobante;
            DataTable dttEmisor;
            DataTable dttReceptor;
            DataTable dttdetalles;
            DataTable dttimpuestos;
            DataTable dttfolios;
    
            string rutaCertificado = string.Empty;
            string rutaKey = string.Empty;
            string ClaveCert = string.Empty;
    
            String rutaXml = string.Empty;
            string rutaPDF = string.Empty;
            int hXml;
    
    
            CapaNegocio.FACTURACION.csFacturacion objFacturacion = new CapaNegocio.FACTURACION.csFacturacion();
    
    
    
    
            public CFD(DataTable dttCFDIComprobante, DataTable dttCFDIEmisor , DataTable dttCFDIREceptor ,  DataTable dttCFDIdetalles , DataTable dttCFDIimpuestos,  DataTable dttCFDIfolios, string rutaCert ,string rutaKey, string Password)
            {
                this.dttComprobante     = dttCFDIComprobante;
                this.dttEmisor          = dttCFDIEmisor;
                this.dttReceptor        = dttCFDIREceptor;
                this.dttdetalles        = dttCFDIdetalles;
                this.dttimpuestos       = dttCFDIimpuestos;
                this.dttfolios          = dttCFDIfolios;
                this.rutaCertificado    = rutaCert;
                this.rutaKey            = rutaKey;
                this.ClaveCert          = Password;
    
            }
    
            public string GeneraDocumento(String version,  string strRutaCFDS, string tasaIva, string tasaISH, SIHWEB.csDatosSIHWEB objDatos)
            {
    
               
                string band = string.Empty;
                try
                {
    
                    // Version del comprobante a generar
                    hXml = VirtualXML_New(version);		// 2.0|2.2|3.0|3.2
    
                    // Informacion de conexion al PAC ( para versiones 3.2 y 3.0 )
    
                    if (version == "3.2")
                    {
                        VirtualXML_SetVirtualPACInfo(hXml,
                            "oskar78",							// Nombre del distribuidor de VirtualPAC
                            "virtual");						// Servidor al que va a enviar a timbrar
                    }
    
                     
    
                    if (version == "2.2")
                    {
    
                        // Informacion de licenciamiento CiberSAT ( para versiones 2.0, 2.2 ú otros pac's distintos a VirtualPAC )
                        VirtualXML_SetCiberSATInfo(hXml,
                            "LILO781103U73",                    // Usuario CiberSAT ( unico por cada cliente que compra la libreria comercial )
                            "HwAAAJoNXRAsPCZ5EbGGUg2HrdjKVtjNS/CXJpjmOR8F0Y7+jcJwglOlQeJIxJn9;QD+RsA==;"); // Llave Electronica generada en el portal, fue generada con el rfc del emisor del comprobante
    
                    }
    
    
    
                    // Informacion del Comprobante
                    VirtualXML_SetComprobanteInfo(hXml,
                        dttfolios.Rows[0]["Serie"].ToString(),			// Serie
                        dttfolios.Rows[0]["NumeroActual"].ToString(),          // Folio
                        "%cb_date",                                     // Fecha en formato AAAA-MM-DDTHH:MM:SS ó macro %cb_date que toma la hora del equipo
                        "ingreso",                                      // Tipo de Comprobante ingreso|egreso|traslado
                        "PAGO EN UNA SOLA EXHIBICION",                  // Forma de pago del documento   pago en una sola exhibición|parcialidad n de n
                       dttComprobante.Rows[0]["Subtotal"].ToString(),   // Subtotal del documento ( ojo todos los importes son sin separador de miles )
                        "",                                             // Descuento, en caso de no tenerlo pasar una cadena vacia
                        dttComprobante.Rows[0]["Total"].ToString(),		// Total del comprobante
                        "",									            // Moneda en la que esta expresada el comprobante, si se usa se debe de especificar tipo de cambio
                        "",									            // Tipo de cambio
                        dttComprobante.Rows[0]["CondicionesPago"].ToString(),	 // Condiciones de Pago
                        dttComprobante.Rows[0]["MetodoPago"].ToString(), // Metodo de pago
                        "");                                            // Motivo de descuento
    
                    // necesario en versiones 2.2 y 3.2
                    // Informacion extendica del comprobante 
                    VirtualXML_SetComprobanteInfoEx(hXml,
                        dttEmisor.Rows[0]["Municipio"].ToString() + " " + dttEmisor.Rows[0]["Estado"].ToString() +" " + dttEmisor.Rows[0]["Pais"].ToString(),                     // Lugar de Expedicion
                        dttComprobante.Rows[0]["CuentaPago"].ToString(),                                 // Ultimos 4 digitos de la cuenta de pago
                        "",                                 // Serie del comprobante original ( para parcialidades )
                        "",                                 // Folio del comprobante original ( para parcialidades )
                        "",									// Monto del comprobante original ( para parcialidades )
                        "");                               // Fecha del comprobante original ( para parcialidades )
    
    
    
    
                    // necesario en versiones 2.0 y 2.2
                    // Informacion de los folios
                    VirtualXML_SetComprobanteCFDInfo(hXml,
                        dttfolios.Rows[0]["Numaprobacion"].ToString(),	// Numero de aprobacion
                        dttfolios.Rows[0]["Ano"].ToString());		   // Año de aprobacion
    
                    // Datos del emisor
                    VirtualXML_SetEmisorInfo(hXml,
                        dttEmisor.Rows[0]["RFC"].ToString(),					// rfc del emisor
                        dttEmisor.Rows[0]["Nombre"].ToString());               // Nombre del emisor
    
    
    
                   
                    // Informacion del Regimen Fiscal para versiones 2.2 y 3.2
                    VirtualXML_AddEmisorRegimenFiscal(hXml,
                        dttEmisor.Rows[0]["RegimenFiscal"].ToString());					// Regimen Fiscal 
                    
    
    
                    // Domicilio del emisor
                    VirtualXML_SetEmisorDomicilio(hXml,
                        dttEmisor.Rows[0]["Calle"].ToString(),			  // Calle
                        dttEmisor.Rows[0]["NumExt"].ToString(),			 // Numero Exterior
                        dttEmisor.Rows[0]["NumInt"].ToString(),		    // Numero Interior
                        dttEmisor.Rows[0]["Colonia"].ToString(),	   // Colonia
                        dttEmisor.Rows[0]["Localidad"].ToString(),	  // Localidad
                        "",									         // Referencia
                        dttEmisor.Rows[0]["Municipio"].ToString(),	 // Municipio
                        dttEmisor.Rows[0]["Estado"].ToString(),      // Estado
                        dttEmisor.Rows[0]["Pais"].ToString(),		// Pais
                        dttEmisor.Rows[0]["CP"].ToString());		// Codigo Postal
    
    
    
    
                    // Datos del receptor
                    VirtualXML_SetReceptorInfo(hXml,
                        dttReceptor.Rows[0]["RFC"].ToString(),					// RFC del receptor
                        dttReceptor.Rows[0]["Nombre"].ToString());			// Nombre del receptor
    
    
    
    
    
    
                    // Domicilio del emisor
                    VirtualXML_SetReceptorDomicilio(hXml,
                       dttReceptor.Rows[0]["Calle"].ToString(),		    // Calle
                        dttReceptor.Rows[0]["NumExt"].ToString(),		// Numero Exterior
                        dttReceptor.Rows[0]["NumInt"].ToString(),		// Numero Interior
                        dttReceptor.Rows[0]["Colonia"].ToString(),		// Colonia
                        dttReceptor.Rows[0]["Localidad"].ToString(),	// Localidad
                        "",									            // Referencia
                        dttReceptor.Rows[0]["Municipio"].ToString(),	// Municipio
                        dttReceptor.Rows[0]["Estado"].ToString(),		// Estado
                        dttReceptor.Rows[0]["Pais"].ToString(),			// Pais
                        dttReceptor.Rows[0]["CP"].ToString());			// Codigo Postal
    
    
    
    
                   
    
    
    
    
                    // Conceptos
                    for (int i = 0; i < dttdetalles.Rows.Count; i++)
                    {
                        VirtualXML_AddConcepto(hXml,
                            dttdetalles.Rows[0]["cantidad"].ToString(),			// Cantidad
                            dttdetalles.Rows[0]["unidad"].ToString(),			// Unidad de medida
                            dttdetalles.Rows[0]["descripcion"].ToString(),		// Descripcion
                            dttdetalles.Rows[0]["valorunitario"].ToString(),	// Precio
                            dttdetalles.Rows[0]["importe"].ToString(),			// Importe
                            dttdetalles.Rows[0]["noidentificacion"].ToString());	// Numero de identificacion		
                    }
    
    
    
                    /***********************************************************************/
                    // Impuestos
    
    
                    //SI EXISTE TASA 0
                    if (decimal.Parse(dttimpuestos.Rows[0]["T0"].ToString()) > 0)
                    {
                        VirtualXML_AddTraslado(hXml,
                        "IVA",								                             // Impuesto
                        "0.00",							                                // Tasa
                        dttimpuestos.Rows[0]["T0"].ToString());						   // Importe
    
                    }
    
    
                    if (decimal.Parse(dttimpuestos.Rows[0]["IVA16"].ToString()) > 0)
                    {
                        VirtualXML_AddTraslado(hXml,
                            "IVA",								        // Impuesto
                            tasaIva,							        // Tasa
                            dttimpuestos.Rows[0]["IVA16"].ToString());   // Importe
                                                               
                    }
    
    
    
    
    
                    if (decimal.Parse(dttimpuestos.Rows[0]["ISH"].ToString()) > 0)
                    {
                        VirtualXML_SetImpuestosLocalesInfo(hXml,
                            dttimpuestos.Rows[0]["ISH"].ToString(),							// Total de traslados locales
                            "0.00");							// Total de retenciones locales
    
                        // Impuesto local trasladado
                        VirtualXML_AddImpuestoLocalTrasladado(hXml,
                            "ISH",								// Impuesto local
                            tasaISH,								// Tasa
                            dttimpuestos.Rows[0]["ISH"].ToString());
                    }
    
    
                    // Generamos un nombre dinamico para la salida del documento
    
                    mtdCrearFolders(strRutaCFDS + "\\" + dttReceptor.Rows[0]["RFC"].ToString());
    
                    rutaXml = strRutaCFDS +"\\" + dttReceptor.Rows[0]["RFC"].ToString()+ "\\CFD_" + dttReceptor.Rows[0]["RFC"].ToString() + "_" + dttEmisor.Rows[0]["RFC"].ToString() + "_" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".xml";
                    rutaPDF = strRutaCFDS +"\\" + dttReceptor.Rows[0]["RFC"].ToString()+ "\\CFD_" + dttReceptor.Rows[0]["RFC"].ToString() + "_" + dttEmisor.Rows[0]["RFC"].ToString() + "_" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".pdf";
    
    
    
    
                    // Generamos el comprobante
                    VirtualXML_ProcesaDocumento(hXml,
                        rutaCertificado,			    // Certificado de Sello Digital
                        rutaKey,			    // Llave privada
                        ClaveCert,						// Password de la llave privada
                        rutaXml);					    // Fichero de salida
    
    
                    // Obtenemos resultados
                    String resultado = VirtualXML_GetValue(hXml, 1);
    
    
                    // Verificamos resultado
                    if (resultado == "VIRTUALXML_OK")
                    {
    
                        mtdCrearPDF(version, objDatos); //metodo que genera el pdf a partir de un reporte
    
                    }
                    else
                        VirtualXML_ShowValue(hXml, 2, resultado);
    
                    band = resultado;
                    
                    
    
    
                }
                catch (System.Exception ex)
                {
                    band = ex.ToString();
                }
                return (band);
            }
    
    
    
        }
    }
          

Todas las respuestas

  • jueves, 02 de agosto de 2012 7:12
    Moderador
     
     

    no has evaluado que quieza debas lanzar la accion desde un thread para que al aplciacion no se congele?

    porque quizas a ocupar mucho el hilo del proceso de la sensacion de no respuesta, si lo lanzas en un thread distinto el principal podria quedar libre


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

  • jueves, 02 de agosto de 2012 15:45
     
     
    bueno olvide mencionar ese detalle, también he probado meterlo en un hilo mientras muestro una animación de  procesando...  pero ocurre lo mismo, decidí quitarlo y probar .. pero tampoco.