Enlace para servidores de automatização do Office com o Visual C# .NET

Traduções de Artigos Traduções de Artigos
Artigo: 302902 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Quando uma aplicação como o Microsoft Office é automatizar aplicação, as chamadas para as propriedades e métodos do escritório objectos de aplicação tem de estar ligados de alguma forma a esses objectos. O processo de propriedade de ligação e chamadas de método para os objectos que implementam as propriedades e métodos normalmente é chamado de enlace . No Visual C#, os dois tipos de ligação disponíveis são ligação antecipada e vinculação posterior . O tipo de enlace que escolher pode afectar muitos aspectos do programa, incluindo desempenho, flexibilidade e maintainability.

Este artigo explica e compara o enlace antecipada e atrasada para clientes de automatização do Visual C# e fornece exemplos de código que demonstram a ambos os tipos de enlace.

Enlace antecipado

Com o enlace inicial, Visual C# é utiliza o tipo de informações disponíveis sobre a aplicação do Office em questão para ligar directamente a métodos ou propriedades necessita de utilizar. O compilador pode executar o tipo e verifica a sintaxe para garantir que o número correcto e o tipo de parâmetros passam para o método ou propriedade e que o valor devolvido será do tipo esperado. Uma vez que menos trabalho é necessário em tempo de execução para efectuar uma chamada para uma propriedade ou método, ligação antecipada por vezes é mais rápida; no entanto, apesar de enlace inicial poderá ser mais rápido, diferenças de desempenho quando comparado com enlace tardio frequentemente insignificantes.

Início do enlace tem a desvantagem secundária que pode introduzir versão possíveis problemas de compatibilidade. Por exemplo, suponha que um servidor de automatização tal como o Microsoft Excel 2002 introduz um novo método ou propriedade que não estiver disponível no Excel 2000 ou efectua uma alteração de um método ou propriedade existente. Estas alterações podem alterar o esquema do objecto binário e causar problemas com uma aplicação do Visual C# que utiliza as informações de tipo Excel 2002 para automatizar o Excel 2000. Para evitar este problema com o enlace inicial, geralmente recomendamos que utilize as informações de tipo para a versão mais antiga da aplicação do Office que pretende suportar quando desenvolver e testar o cliente de automatização.

Os seguintes passos demonstram como criar um cliente de automatização que utiliza o enlace inicial. Repare que, como os passos ilustram, início do enlace requer para referenciar a biblioteca de tipos para o cliente de automatização.

Criar um cliente de automatização que utiliza o enlace inicial

  1. Inicie o Microsoft Visual Studio NET.. No menu ficheiro , clique em Novo e em seguida, clique em projecto . Seleccione os tipos de Visual C# Projects Aplicação do Windows . É criado o Form1 por predefinição.
  2. Adicione uma referência para o Microsoft Excel Object Library . Para o fazer, siga estes passos:
    1. No menu projecto , clique em Add Reference .
    2. No separador COM , localizar a Biblioteca de objectos do Microsoft Excel e clique em Seleccionar .

      Nota O Office 2003 inclui Primary Interop Assemblies (PIAs). O Office XP não inclui PIAs, mas pode ser transferidos. Para obter informações adicionais sobre PIAs do Office XP, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
      328912Microsoft Office XP principais interop assemblies (PIAs) estão disponíveis para transferência
    3. Clique em OK na caixa de diálogo Adicionar referências para aceitar as selecções. Se receber um pedido para gerar wrappers para as bibliotecas que seleccionou, clique em Sim .
  3. No menu Ver , seleccione a caixa de ferramentas para visualizar a mesma e adicione um botão ao Form1.
  4. Faça duplo clique em Button1 . Aparece a janela código para o formulário.
  5. Na janela de código, substitua o seguinte código
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    					
    com:
    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. Desloque-se para o início da janela de código. Adicionar a seguinte linha no fim da lista de directivas utilizando :
    using System.Reflection;
    using Excel = Microsoft.Office.Interop.Excel;
    					

Enlace dinâmico

Em contraste com o enlace inicial, a ligação mais tarde aguarda até que tempo de execução para ligar propriedades e método de chamadas para os respectivos objectos. Para efectuar este procedimento, o objecto de destino tem de implementar uma interface COM especial: IDispatch . O método IDispatch::GetIDsOfNames permite Visual C# para interrogar um objecto sobre os métodos e propriedades que suporta e, em seguida, permite o método IDispatch::Invoke Visual C# para chamar esses métodos e propriedades. Enlace tardio desta forma tem a vantagem de remover algumas das dependências versão inerentes com ligação antecipada. No entanto, tem as desvantagens Remover verificações de tempo de compilação a integridade do código de automatização, bem como não fornecer funcionalidades de IntelliSense podem fornecer pistas para corrigir as chamadas para métodos e propriedades.

Para utilizar enlace tardio no Visual C#, utilize o método System.Type.InvokeMember . Este método chama IDispatch::GetIDsOfNames e IDispatch::Invoke para ligar a métodos e propriedades do servidor de automatização.

Criar um cliente de automatização que utiliza o enlace tardio

  1. Inicie o Microsoft Visual Studio NET.. No menu ficheiro , clique em Novo e em seguida, clique em projecto . Seleccione os tipos de Visual C# Projects Aplicação do Windows . É criado o Form1 por predefinição.
  2. No menu Ver , seleccione a caixa de ferramentas para visualizar a mesma e adicione um botão ao Form1.
  3. Faça duplo clique em Button1 . Aparece a janela código para o formulário.
  4. Na janela de código, substitua o seguinte código
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    						
    com:
    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. Desloque-se para o início da janela de código. Adicionar a seguinte linha no fim da lista de directivas utilizando :
    using System.Reflection; 
    					

Referências

Para mais informações, visite o seguinte Web site da Microsoft Developer Network (MSDN):
Desenvolvimento do Microsoft Office com o Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obter informações adicionais sobre a ligação, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
245115Utilizar ligação antecipada e vinculação posterior na automatização
244167Clientes de automatização de escrita para várias versões do Office
247579Utilizar ligação DISPID para automatizar a aplicações do Office sempre que possível

Propriedades

Artigo: 302902 - Última revisão: 27 de março de 2007 - Revisão: 7.4
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbpia kbautomation kbhowtomaster KB302902 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 302902

Submeter comentários

 

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