
PInvokeStackImbalance en Pruebas de Unidad (Unit Test)
A veces es necesario realizar un desarrollo de una librería en .NET que realiza llamadas a librerías de C/C++, porque vienen de funcionalidades más antiguas o simplemente porque en C/C++ corre más en las que se necesita hacer cálculo intensivo.
Si es así, al realizar las pruebas de unidad (unit test), te puede aparecer el problema PInvokeStackImbalance:
Una llamada a la función PInvoke ‘MiDll!<Module>::miFuncionC’ impidió la correspondencia de la pila. Es posible que la razón sea que la firma PInvoke administrada no coincida con la firma de destino no administrada. Compruebe que la convención y los parámetros de llamada de la firma PInvoke coinciden con la firma no administrada de destino.
Lo que viene a significar PInvokeStackImbalance es que la firma de la función a la que se llama no es la esperada. En mi caso estaba seguro que la firma de la función era correcta puesto que en el uso de la función, fuera de las pruebas de unidad, funcionaba perfectamente.
Por lo que el problema es como .NET llama a las funciones de código nativo. Desde .NET tenemos estos distintos tipos de convenios de llamadas a través del enumerado CallingConvention:
Members
Member name | Description |
---|---|
Cdecl | The caller cleans the stack. This enables calling functions with varargs, which makes it appropriate to use for methods that accept a variable number of parameters, such as Printf. |
FastCall | This calling convention is not supported. |
StdCall | The callee cleans the stack. This is the default convention for calling unmanaged functions with platform invoke. |
ThisCall | The first parameter is the this pointer and is stored in register ECX. Other parameters are pushed on the stack. This calling convention is used to call methods on classes exported from an unmanaged DLL. |
Winapi Supported by the .NET Compact Framework. | This member is not actually a calling convention, but instead uses the default platform calling convention. For example, on Windows the default is StdCall and on Windows CE .NET it is Cdecl. |
Más info: https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.71%29.aspx
.NET por defecto usa StdCall, pero mi librería usa Cdecl.
Evitar PInvokeStackImbalance: Definir convenios de llamadas a funciones
Para especificar el convenido de llamada usaremos los atributos de DllImport.
Si en un inicio tenemos definida nuestra función de esta manera:
[DllImport(«MiDll», CharSet=CharSet::Ansi)]
extern «C» void *MiFuncionC(int id);
pasamos a especificar el convenio de llamada de esta otra manera:
[DllImport(«MiDll», CharSet=CharSet::Ansi,CallingConvention=CallingConvention::Cdecl)]
extern «C» void *MiFuncionC(int id);
De esta manera en las pruebas de unidad se fuerza a usar el convenio Cdecl evitando la excepción PInvokeStackImbalance.

Error LNK1123: error durante la conversión a COFF: archivo no válido o dañado
Después de la instalación del Framework .NET 4.5 de Microsoft, un proyecto en C++ me da el error «error LNK1123: error durante la conversión a COFF: archivo no válido o dañado» motivado por el ejecutable CVTRES.EXE.
En muchas webs te aportan la solución que propone MSDN aquí, que se basa en hacer los siguientes pasos (a mi no me solucionó nada):
- Aplique todos los service packs y actualizaciones para su versión de Visual Studio. Esto es especialmente importante para Visual Studio 2010.
- Intente compilar con la vinculación incremental deshabilitada. En la barra de menús, seleccione Proyecto, Propiedades. En el cuadro de diálogo Páginas de propiedades, expanda Propiedades de configuración, Vinculador. Cambie el valor de Habilitar vinculación incremental a No.
- Compruebe que la versión de CVTRES.EXE que se encuentra primero en la variable de entorno PATH coincide con la versión de las herramientas de compilación, o la versión del conjunto de herramientas de la plataforma, utilizada por el proyecto.
- Asegúrese de que el tipo de archivo es válido. Por ejemplo, asegúrese de que un objeto OMF es de 32 bits y no de 16 bits. Para más información, consulte Archivos .obj como entrada del vinculador y Especificación de Microsoft PE y COFF.
- Compruebe que el archivo no está dañado. Vuelva a compilar, si es necesario.
El verdadero error LNK1123
El verdadero problema es que se instaló el ejecutable CVTRES.EXE de una versión errónea. Es más si intentáis ejecutarlo veréis que ni siquiera sois capaces de hacerlo (de ahí el error LNK1123):
[bctt tweet=»El verdadero problema es que se instaló el ejecutable CVTRES.EXE de una versión errónea»]
C:\> C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
Este fichero tiene las siguientes propiedades:
Solución a LNK1123
En mi caso tengo la versión previa del fichero CVTRES.exe en la siguiente dirección:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
con este último fichero lo copias (sobreescribiendo en existente) en:
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
tienes el problema de LNK1123 solucionado.

Desactivar ContextSwitchDeadlock
Cuando trabajamos en Visual Studio en una aplicación de cálculo intensivo puede aparecer la excepción ContextSwitchDeadlock was detected
Si lo ejecutamos desde Visual Studio, nos permite hacer «OK» o «Continue«…
si le damos «Continue«, se desarrolla sin problemas.
Message: The CLR has been unable to transition from COM context 0x1a70a0 to COM context 0x1a6f30 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages.
This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.
Esto pasa en Debug porque un thread COM queda como dice el mensaje esperando algún mensaje que obviamente al estar debugeando nadie le manda. Esto es un tema conocido y solo sucede si tenés habilitado los Managed Assistant del Visual Studio. Si deshabilitas esta «ayuda» no volverá a aparecer este mensaje.
Desactivar ContextSwitchDeadlock
[bctt tweet=»Como desactivar el ContextSwitchDeadlock en Visual Studio»]
Para desactivar el ve al menú
Debug > Exceptions > Managed Debugging Assistants > ContextSwitchDeadlock

Catastro: Servicios de consulta disponibles
Catastro dispone de múltiples servicios de consultas, unos libres y otros restringidos. Nos centraremos en los libres.
Las consultas se podrán realizar SOAP, HTTP GET o HTTP POST. Se mostrarán las llamadas HTTP GET, para otros tipos consultar la referencia.
Como resumen hablaremos de:
- Conversion de coordenadas XY a Referencias Catastrales
- Conversion de Referencias Catastrales a coordenadas XY
- Consulta de datos catastrales por su localización
- Consulta de datos catastrales por su Referencia Catastral
- Otros servicios de callejeros
- Ejemplos C#
Se proporcionan los enlaces de las páginas oficiales y otras de referencia donde desarrollan de una manera más exaustiva las llamadas y con formularios para realizar pruebas.
Sistemas de coordenadas disponibles en catastro
Los sistemas de coordenadas soportados por el catastros en cualquiera de sus consultas se muestran a continuación:
SRS | Descripción |
EPSG:4230 | Geográficas en ED 50 |
EPSG:4326 | Geográficas en WGS 80 |
EPSG:4258 | Geográficas en ETRS89 |
EPSG:32627 | UTM huso 27N en WGS 84 |
EPSG:32628 | UTM huso 28N en WGS 84 |
EPSG:32629 | UTM huso 29N en WGS 84 |
EPSG:32630 | UTM huso 30N en WGS 84 |
EPSG:32631 | UTM huso 31N en WGS 84 |
EPSG:25829 | UTM huso 29N en ETRS89 |
EPSG:25830 | UTM huso 30N en ETRS89 |
EPSG:25831 | UTM huso 31N en ETRS89 |
EPSG:23029 | UTM huso 29N en ED50 |
EPSG:23030 | UTM huso 30N en ED50 |
EPSG:23031 | UTM huso 31N en ED50 |
Recordar que por el Real Decreto 1071/2007, de 27 de julio, por el que se regula el sistema geodésico de referencia oficial en España establece que:
Se adopta el sistema ETRS89 (European Terrestrial Reference System 1989) como sistema de referencia geodésico oficial en España para la referenciación geográfica y cartográfica en el ámbito de la Península Ibérica y las Islas Baleares. En el caso de las Islas Canarias, se adopta el sistema REGCAN95. Ambos sistemas tienen asociado el elipsoide GRS80 y están materializados por el marco que define la Red Geodésica Nacional por Técnicas Espaciales, REGENTE, y sus densificaciones.
Conversion de coordenadas XY a Referencias Catastrales
A partir de unas coordenadas (X e Y) y su sistema de referencia se obtiene la referencia catastral de la parcela localizada en ese punto así como el domicilio (municipio, calle y número o polígono, parcela y municipio).
GET /ovcservweb/OVCSWLocalizacionRC/OVCCoordenadas.asmx/Consulta_RCCOOR?SRS=string&Coordenada_X=string&Coordenada_Y=string HTTP/1.1
Host: ovc.catastro.meh.es
Referencia: https://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCoordenadas.asmx?op=Consulta_RCCOOR
Conversion de Referencias Catastrales a coordenadas XY
A partir de la RC de una parcela se obtienen las coordenadas X, Y en el sistema de referencia en el que está almacenado el dato en la D. G. del Catastro, a menos que se especifique lo contrario en el parámetro opcional SRS que se indica en la respuesta, así como el domicilio (municipio, calle y número o polígono, parcela y municipio).
GET /ovcservweb/OVCSWLocalizacionRC/OVCCoordenadas.asmx/Consulta_CPMRC?Provincia=string&Municipio=string&SRS=string&RC=string HTTP/1.1
Host: ovc.catastro.meh.es
Referencia: https://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCoordenadas.asmx?op=Consulta_CPMRC
Consulta de datos catastrales por su localización
Este servicio puede devolver o bien la lista de todos los inmuebles que coinciden con los criterios de búsqueda, proporcionando para cada inmueble la referencia catastral y su localización (bloque/escalera/planta/puerta) o bien, en el caso de que solo exista un inmueble con los parámetros de entrada indicados, proporciona los siguientes datos de un inmueble:
– Tipo: urbano (UR) o rústico (RU)
– Referencia catastral
– Domicilio tributario
– Uso
– Superficie
– Coeficiente de participación
– Antigüedad
– Listado de unidades constructivas (con escalera/planta/puerta y superficie)
– Superficie de los elementos comunes
– Listado de subparcelas (con el código de la subparcela, cultivo, intensidad productiva y superficie)
Por otro lado este servicio va comprobando que los contenidos de los parámetros de entrada son correctos (existe la provincia, el municipio, el tipo de vía y la vía y el número) en caso de que alguno no sea correcto, devuelve un error («La provincia no existe», «El municipio no existe» etc.) y devuelve una lista con los candidatos igual que en los puntos anteriores.
GET /ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx/Consulta_DNPLOC?Provincia=string&Municipio=string&Sigla=string&Calle=string&Numero=string&Bloque=string&Escalera=string&Planta=string&Puerta=string HTTP/1.1
Host: ovc.catastro.meh.es
Referencia: http://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?op=Consulta_DNPLOC
Consulta de datos catastrales por su Referencia Catastral
Este servicio es idéntico al de «Consulta de DATOS CATASTRALES NO PROTEGIDOS de un inmueble identificado por su localización» en todo excepto en los parámetros de entrada.
Parámetros de entrada:
Provincia: Obligatorio. Denominación de una provincia según lo devuelto en el listado de provincias.
Municipio: Obligatorio. Denominación de un municipio según lo devuelto en el listado de municipios.
RC: Obligatorio. Referencia catastral. Puede tener 14, 18 o 20 posiciones. En caso de que sean 14 posiciones (lo que se corresponde con la referencia de una finca), se devuelve una lista de todos los inmuebles de esa finca (es decir cuyos 14 primeros caracteres de la RC coinciden con el parámetro).
GET /ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx/Consulta_DNPRC?Provincia=string&Municipio=string&RC=string HTTP/1.1
Host: ovc.catastro.meh.es
Referencia: http://ovc.catastro.meh.es/ovcservweb/OVCSWLocalizacionRC/OVCCallejero.asmx?op=Consulta_DNPRC
Otros servicios de callejeros
La Sede Electrónica del Catastro proporciona los siguientes servicios. Para una descripción formal, consulte el documento WSDL del servicio.
- ConsultaMunicipioCodigos
Servicio de consulta de municipios para una provincia (Por códigos). - ConsultaViaCodigos
Servicio de consulta de vias para un municipio (Por códigos). - Consulta_DNPRC_Codigos
Servicio de consulta de datos no protegidos para un inmueble por su referencia catastral (Por códigos). - ConsultaNumeroCodigos
Servicio de consulta de números para una via (Por códigos). - ConsultaProvincia
Servicio de consulta de provincias. - Consulta_DNPPP_Codigos
Servicio de consulta de datos no protegidos para un inmueble por su polígono parcela (Por códigos). - Consulta_DNPLOC_Codigos
Servicio de consulta de datos no protegidos para un inmueble por su localización (Por códigos).
Ejemplos C#
Ejemplos del Clientes en C#: http://www.somfueal.es/mediawiki/index.php/CLIENTES
Fuentes de información
- Documento catastro: Servicios de consulta de datos catastrales no protegidos
- Consumo de Servicios Web oficina virtual del catastro, Consulta del Callejero y Conversor de coordenadas: http://www.somfueal.es/mediawiki/index.php/CATASTRO

Compactar base de datos de SQLite
El sistema de base de datos de SQLite se puede acceder desde C#, para ello disponemos de la librería System.Data.SQLite.
En caso de que nuestra base de datos crezca mucho de tamaño pero no de datos tenemos la posibilidad de compactarla.
Para compactar una base de datos de SQLite desde C# se realiza de la siguiente manera:
using (SQLiteCommand command = m_connection.CreateCommand())
{
command.CommandText = «vacuum;»;
command.ExecuteNonQuery();
}
Para más información:
http://sqlite.org/lang_vacuum.html