Archivos de la etiquetas c#

free-the-mallocs c

PInvokeStackImbalance en Pruebas de Unidad (Unit Test)

free-the-mallocs cA 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

Visual Studio LogoDespué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):

El verdadero problema es que se instaló el ejecutable CVTRES.EXE de una versión errónea Clic para tuitear

C:\> C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

error-lnk1123-cvtres.exeEste fichero tiene las siguientes propiedades:

lnk1123-propiedades-cvtres.exeSolució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

Visual Studio LogoCuando 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

Como desactivar el ContextSwitchDeadlock en Visual Studio Clic para tuitear

Para desactivar el ve al menú

Debug > Exceptions > Managed Debugging Assistants > ContextSwitchDeadlock

Desactivar ContextSwitchDeadlock

 

Catastro: Servicios de consulta disponibles

catastroCatastro 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.

Ejemplos C#

Ejemplos del Clientes en C#: http://www.somfueal.es/mediawiki/index.php/CLIENTES

Fuentes de información

Logo SQLite - Como compactar una base de datos SQLite

Compactar base de datos de SQLite

Logo SQLite - Como compactar una base de datos 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