MI APLICACION SE CONGELA AL REALIZAR LA INVOCACION DE UNA LIBRERIA
-
jueves, 02 de agosto de 2012 3:24
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); } } }
- Tipo cambiado Eder CostaOwner miércoles, 15 de agosto de 2012 17:08
Todas las respuestas
-
jueves, 02 de agosto de 2012 7:12Moderador
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:45bueno 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.

