Con la aparición de .NET en el panorama de los lenguajes de programación muchos de nosotros, desarrolladores de software, tuvimos que escoger entre desarrollar software en VB.NET o C#. Gestionado de forma correcta VB.NET y C# no tienen ventajas evidentes uno sobre el otro y en la mayoría de los casos la elección se limitaba a una cuestión de familiaridad o comodidad con la sintaxis del propio lenguaje. A los que nos decantamos por la nueva sintaxis de C# de vez en cuando nos vemos empujados por causas de fuerza mayor al desarrollo de ciertos módulos o librarías en VB.NET. Una de las principales causas ha sido y todavía es, sin duda, la comunicación con interfaces COM.
C# permite la comunicación con objetos COM mediante un PIA (Primary Interop Assembly), un ensamblado en código manejado, que hace de interfaz entre nuestra aplicación y el objeto. Este PIA está estrechamente ligado a la versión del COM con el que vamos a comunicar y debe ser desplegado junto con nuestra aplicación. La interfaz generada es pesada de utilizar en C# por numerosas razones de nomenclatura en los métodos. En contrapartida VB.NET tiene la habilidad heredada de VB6 de realizar late-binding con este tipo de objetos, de forma que no se hace necesaria la creación de un PIA, siendo mucho más cómodo de trabajar.
En C# 4.0 se introducen los tipos dinámicos mediante la palabra clave dynamic, lo cual nos aporta nuevas formas de desarrollar y nos ahorra disgustos en el enlace con COM. Muchos puristas quizás no estén completamente de acuerdo con la necesidad de introducir este tipado en tiempo de ejecución pero seguro que más de uno lo agradecerá. ¿Morirá algún día la tecnología COM? De momento sigue bien viva y no parece que tenga fecha de caducidad, de forma que bienvenidas sean las nuevas características de late-binding de C# 4.0.
Aquí podéis ver un ejemplo de enlace con Word (vía COM) desde C# 4.0.
public static class WordDocument
{
public const String TemplateName = @"Sample.dotx";
public const String CurrentDateBookmark = "CurrentDate";
public const String SignatureBookmark = "Signature";
public static void Create(string file, DateTime now, String author)
{
// Run Word and make it visible for demo purposes
dynamic wordApp = new Application { Visible = true };
// Create a new document
var doc = wordApp.Documents.Add(TemplateName);
templatedDocument.Activate();
// Fill the bookmarks in the document
doc.Bookmarks[CurrentDateBookmark].Range.Select();
wordApp.Selection.TypeText(current.ToString());
doc.Bookmarks[SignatureBookmark].Range.Select();
wordApp.Selection.TypeText(author);
// Save the document
doc.SaveAs(fileName);
// Clean up
templatedDocument.Close();
wordApp.Quit();
}
}
Vía: C# 4.0, the Dynamic Keyword and COM