Roberto Sánchez - Programador .NET/C++

Llamando a C++.

Como bien sabes (o bedebías saber), los ensamblados escritos en lenguajes de .NET pueden ser descompilados y se puede acceder, aunque sea de una manera parcial e inexacta, a su código fuente. Para evitarlo hay métodos de ofuscación que pueden mitigar en gran parte que alguien puedar acceder a información sensible del código fuente, aunque también hay que deir que si en el código fuiente hay algo sensible, entonces es que el código fuente no está bien hecho. Datos como cadenas de conexión a bases de datos, claves o contraseñas, etc., no deberían estar contenidas en cadenas de texto simples que podrían ser accesibles, sino que deben estar encriptadas.

No obstante lo anterior, y sin querer entrar en el amplio tema de la ofuscación de código, y estando advertido de que los elementos sensibles deben estar encriptados, te ofrezco una manera (no sencilla) de ocultar secciones de código fuente "sensible": escribir en C++ y llamar a este código desde C#. Con ello se obtienen dos ventajas:

- Ocultación de código fuente sensible.

- Llegar allí conde con C# no llegas, o es muy difícil llegar.

Bien es sabida la dificultad que entraña el aprendizaje del lenguaje de programación C++, así como las ventajas que lenguajes de alto nivel como C# nos ofrecen para "olvidarnos" del funcionamiento de las máquinas a bajo nivel. No obstante, y es por ello, que C++ nos permitirá un amplio abanico de posibilidades no alcanzadas en C# y una mayor potencia de computación.

Pues bien: es posible combinar C# y C++ nativo en una misma aplicación, de manera que ambos trabajen juntos pero no revueltos. Cada uno a lo suyo, de manera independiente, pero con una comunicación desde C# a C++ para que el primero se beneficie del trabajo del segundo. Por ejemplo: una aplicación que realiza potentes cálculos matemáticos y los muestra en pantalla; C# se encargará de la visualización y C++ se encargará de la computación. Cuandpo C# requiera la realización de los cálculos llamará a metodos contenidos en el código C++ y éstos devolverán los resultados a C#.

Veamos un ejemplo de llamada a un método de C++ desde C#:

[DllImport("dllCPlusPlus.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "compareKeys")]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool CompareKeys([MarshalAs(UnmanagedType.LPStr)] string firstKey, [MarshalAs(UnmanagedType.LPStr)] string secondKey);

En los atributos del método se establece el nombre del archivo del ensamblado de C++, el tipo de llamada, la estructura de los caracteres y el nombre textual del método escrito en C++. A continuación se establece el tipo de valor devuelto, en este caso del tamaño de un byte, correspondiente al tipo booleano. Y finalmente se inicializa el nombre del método en C# que será llamado desde éste, además de sus dos parámetros de tipo de cadena de texto.

Desde C# se llamará al método 'CompareKeys' con los dos parámetros de tipo de cadena de texto, C++ realizará la operación de comparación, y nos devolverá 'true' o 'false' según sea el resultado de la comparación.

En el lado de C++ deberemos inicializar el método en el archivo de cabecera de la siguiente manera:

extern "C" __declspec(dllexport) bool __stdcall compareKeys(const char*, const char*);

Se declara el método externo, que devuelve tipo booleano y que acepta dos parámetros de tipo cadena de texto.

Este ha sido un ejemplo muy sencillo, pero se puede complicar todo lo necesario que se quiera, hasta el punto de transferir a C++ todas las funcionalidades posibles. Con el tiempo serás capaz de tener aplicaciones combinando los dos lenguajes, dejando para C# la visualización y control general de la aplicación y para C++ el "trabajo duro".