Enlazar con servidores de automatización de Office mediante Visual C# .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 302902 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E302902
Expandir todo | Contraer todo

En esta página

Resumen

Cuando automatiza una aplicación, por ejemplo de Microsoft Office, las llamadas a las propiedades y métodos de sus objetos se deben conectar de algún modo a dichos objetos. El proceso de conectar las llamadas a las propiedades y métodos con los objetos que implementan esas propiedades se suele denominar enlace. En Visual C#, los dos tipos de enlace disponibles son el enlace anticipado y el enlace en tiempo de ejecución. El tipo de enlace que elija puede afectar a numerosos aspectos del programa, como son el rendimiento, la flexibilidad y la capacidad de mantenimiento.

En este artículo se explican y se comparan el enlace anticipado y el enlace en tiempo de ejecución en los clientes de Automatización de Visual C#, y se proporcionan ejemplos de código que demuestran ambos tipos de enlace.

Enlace anticipado

Con el enlace anticipado, Visual C# usa la información de los tipos que está disponible acerca de la aplicación de Office en cuestión para enlazar directamente con los métodos o propiedades que tiene que usar. El compilador puede realizar las comprobaciones de la sintaxis y tipos para asegurarse de que se pasa el número y tipo de parámetros correctos al método o propiedad, y que el valor devuelto será del tipo esperado. Dado que se requiere menos trabajo para realizar una llamada a una propiedad o un método en tiempo de compilación, el enlace anticipado es en ocasiones más rápido; sin embargo, aunque puede ser más rápido, las diferencias en el rendimiento si se compara con el enlace en tiempo de ejecución suelen ser insignificantes.

El enlace anticipado tiene la desventaja poco importante de que puede introducir posibles problemas de compatibilidad entre versiones. Por ejemplo, suponga que un servidor de Automatización como Microsoft Excel 2002 introduce un método o propiedad nuevos que no estaban disponibles en Excel 2000, o hace un cambio en una propiedad o método. Estos cambios pueden alterar la estructura binaria de un objeto y ocasionar problemas con una aplicación de Visual C# que use la información de tipos de Excel 2002 para automatizar Excel 2000. Para evitar este problema con el enlace anticipado, se suele recomendar el uso de la información de tipos de la versión anterior de la aplicación de Office que desee usar cuando desarrolle y pruebe el cliente de Automatización.

Los pasos siguientes demuestran cómo generar un cliente de Automatización que use el enlace anticipado. Tenga en cuenta que, como se ilustra en el procedimiento, el enlace anticipado requiere que haga referencia a la biblioteca de tipos del cliente de Automatización.

Crear un cliente de Automatización que use enlace anticipado

  1. Inicie Microsoft Visual Studio .NET. En el menú Archivo, haga clic en Nuevo y, después, haga clic en Proyecto. Seleccione Aplicación para Windows en los tipos de proyectos de Visual C#. De manera predeterminada se creará Form1.
  2. Agregue una referencia a la Biblioteca de objetos de Microsoft Excel. Para ello, siga estos pasos:
    1. En el menú Proyecto, haga clic en Agregar referencia.
    2. En la ficha COM, busque la Biblioteca de objetos de Microsoft Excel y haga clic en Seleccionar.

      Nota: Office 2003 incluye Ensamblados de interoperabilidad principal (PIA, Primary Interop Assemblies). Office XP no incluye PIA, pero se pueden descargar. Para obtener información adicional acerca de los PIA de Office XP, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
      328912 Hay disponibles ensamblados de interoperabilidad primarios (PIA) de Microsoft Office XP para descargar
    3. Haga clic en Aceptar en el cuadro de diálogo Agregar referencias para aceptar sus selecciones. Si recibe un mensaje para generar contenedores para las bibliotecas seleccionadas, haga clic en .
  3. En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas y agregue un botón a Form1.
  4. Haga doble clic en Button1. Aparecerá la ventana de código del formulario.
  5. En la ventana de código, reemplace el código siguiente
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    					
    por:
    private void button1_Click(object sender, System.EventArgs e)
    {
    	Excel.Application objApp;
    	Excel._Workbook objBook;
    	Excel.Workbooks objBooks;
    	Excel.Sheets objSheets;
    	Excel._Worksheet objSheet;
    	Excel.Range range;
    
    	try
    	{
    		// Instantiate Excel and start a new workbook.
    		objApp = new Excel.Application();
    		objBooks = objApp.Workbooks;
    		objBook = objBooks.Add( Missing.Value );
    		objSheets = objBook.Worksheets;
    		objSheet = (Excel._Worksheet)objSheets.get_Item(1);
    
    		range = objSheet.get_Range("A1", Missing.Value);
    
    		range.set_Value(Missing.Value, "Hello, World!" );
    
    		//Return control of Excel to the user.
    		objApp.Visible = true;
    		objApp.UserControl = true;
    	}
    	catch( Exception theException ) 
    	{
    		String errorMessage;
    		errorMessage = "Error: ";
    		errorMessage = String.Concat( errorMessage, theException.Message );
    		errorMessage = String.Concat( errorMessage, " Line: " );
    		errorMessage = String.Concat( errorMessage, theException.Source );
    
    		MessageBox.Show( errorMessage, "Error" );
    	}
    }  
    					
  6. Vaya al principio de la ventana de código. Agregue la línea siguiente al final de la lista de directivas using:
    using System.Reflection;
    using Excel = Microsoft.Office.Interop.Excel;
    					

Enlace en tiempo de ejecución

A diferencia del enlace anticipado, el enlace en tiempo de ejecución espera hasta el tiempo de ejecución para enlazar las propiedades y métodos a sus objetos. Para ello, el objeto de destino debe implementar una interfaz COM especial: IDispatch. El método IDispatch::GetIDsOfNames permite a Visual C# interrogar a un objeto a cerca de qué métodos y propiedades admite, y el método IDispatch::Invoke permite entonces que Visual C# llame a dichos métodos y propiedades. De esta manera, el enlace en tiempo de ejecución tiene la ventaja de eliminar algunas de las dependencias de la versión que son inherentes al enlace anticipado. Sin embargo, tiene las desventajas de quitar también las comprobaciones en tiempo de compilación de la integridad del código de automatización, además de no proporcionar las características Intellisense que pueden ofrecer pistas para corregir las llamadas a los métodos y propiedades.

Para usar en enlace en tiempo de ejecución en Visual C#, use el método System.Type.InvokeMember. Este método llama a IDispatch::GetIDsOfNames y IDispatch::Invoke para enlazar con los métodos y propiedades del servidor de Automatización.

Crear un cliente de Automatización que usa enlace en tiempo de ejecución

  1. Inicie Microsoft Visual Studio .NET. En el menú Archivo, haga clic en Nuevo y, después, haga clic en Proyecto. Seleccione Aplicación para Windows en los tipos de proyectos de Visual C#. De manera predeterminada se creará Form1.
  2. En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas y agregue un botón a Form1.
  3. Haga doble clic en Button1. Aparecerá la ventana de código del formulario.
  4. En la ventana de código, reemplace el código siguiente
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    						
    por:
    private void button1_Click(object sender, System.EventArgs e)
    {
    	object objApp_Late;
    	object objBook_Late;
    	object objBooks_Late;
    	object objSheets_Late;
    	object objSheet_Late;
    	object objRange_Late;
    	object[] Parameters;
    
    	try
    	{
    		// Get the class type and instantiate Excel.
    		Type objClassType; 
    		objClassType = Type.GetTypeFromProgID("Excel.Application"); 
    		objApp_Late = Activator.CreateInstance(objClassType);
    
    		//Get the workbooks collection.
    		objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks", 
    		BindingFlags.GetProperty, null, objApp_Late, null );
    
    		//Add a new workbook.
    		objBook_Late = objBooks_Late.GetType().InvokeMember( "Add", 
    			BindingFlags.InvokeMethod, null, objBooks_Late, null );
    
    		//Get the worksheets collection.
    		objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets",
    			BindingFlags.GetProperty, null, objBook_Late, null );
    
    		//Get the first worksheet.
    		Parameters = new Object[1];
    		Parameters[0] = 1;
    		objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item", 
    			BindingFlags.GetProperty, null, objSheets_Late, Parameters );
    
    		//Get a range object that contains cell A1.
    		Parameters = new Object[2];
    		Parameters[0] = "A1";
    		Parameters[1] = Missing.Value;
    		objRange_Late = objSheet_Late.GetType().InvokeMember( "Range",
    			BindingFlags.GetProperty, null, objSheet_Late, Parameters );
    
    		//Write "Hello, World!" in cell A1.
    		Parameters = new Object[1];
    		Parameters[0] = "Hello, World!";
    		objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, 
    			null, objRange_Late, Parameters );
    
    		//Return control of Excel to the user.
    		Parameters = new Object[1];
    		Parameters[0] = true;
    		objApp_Late.GetType().InvokeMember( "Visible", BindingFlags.SetProperty,
    			null, objApp_Late, Parameters );
    		objApp_Late.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty,
    			null, objApp_Late, Parameters );
    	}
    	catch( Exception theException ) 
    	{
    		String errorMessage;
    		errorMessage = "Error: ";
    		errorMessage = String.Concat( errorMessage, theException.Message );
    		errorMessage = String.Concat( errorMessage, " Line: " );
    		errorMessage = String.Concat( errorMessage, theException.Source );
    
    		MessageBox.Show( errorMessage, "Error" );
    	}
    }
    					
  5. Vaya al principio de la ventana de código. Agregue la línea siguiente al final de la lista de directivas using:
    using System.Reflection; 
    					

Referencias

Para obtener más información al respecto, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obtener información adicional acerca del enlace, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
245115 Utilizar enlace anticipado y enlace en tiempo de ejecución en automatización
244167 Escribir clientes de automatización para varias versiones de Office
247579 Utilizar siempre que se pueda el enlace DISPID para automatizar aplicaciones de Office

Propiedades

Id. de artículo: 302902 - Última revisión: jueves, 22 de febrero de 2007 - Versión: 7.2
La información de este artículo se refiere a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
Palabras clave: 
kbpia kbautomation kbhowtomaster KB302902

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com