Código de chamada no nível do aplicativo Add-ins de outras soluções do Office
Você pode expor um objeto no seu suplemento para outras soluções, incluindo outras soluções de Microsoft Office. Isso é útil se o seu suplemento fornece um serviço que você deseja ativar a outras soluções de usar. Por exemplo, se você tiver um suplemento do Excel de Microsoft Office que executa cálculos nos dados financeiros de um serviço Web, outras soluções podem executar esses cálculos chamando o suplemento do Excel em tempo de execução.
Aplicável a: As informações neste tópico se aplicam a projetos de nível de aplicativo para Microsoft Office 2010 e o sistema 2007 do Microsoft Office. Para obter mais informações, consulte Recursos disponíveis pelo aplicativo do Office e o tipo de projeto.
Há duas etapas principais nesse processo:
No seu suplemento, expõe um objeto para outras soluções.
Outra solução, acesse o objeto exposto pelo suplemento e membros de chamada do objeto.
Tipos de soluções que podem chamar o código em um suplemento
Você pode expor um objeto em um suplemento para os seguintes tipos de soluções:
Visual Basic for Applications o código VBA () em um documento que é carregado no mesmo processo do aplicativo como seu suplemento.
Personalizações em nível de documento que são carregadas no mesmo processo do aplicativo como seu suplemento.
Outros suplementos criados usando os modelos de projeto do Office em Visual Studio.
Suplementos de COM (ou seja, add-ins que implementam o IDTExtensibility2 interface diretamente).
Qualquer solução que está sendo executado em um processo diferente do suplemento (esses tipos de soluções também são nomeados clientes de fora do processo). Eles incluem aplicativos que automatizam a um aplicativo do Office, como, por exemplo, Windows Forms ou console application e suplementos que são carregados em um processo diferente.
Expor objetos a outras soluções
Para expor um objeto em seu suplemento a outras soluções, execute as seguintes etapas no seu suplemento:
Defina uma classe que você deseja expor a outras soluções.
Substituir o RequestComAddInAutomationService método de ThisAddIn classe. Retorne uma instância da classe que você deseja expor a outras soluções.
Definição da classe que você deseja expor a outras soluções
No mínimo, a classe que você deseja expor deve ser pública, ele deve ter o ComVisibleAttribute atributo definido como true, e ele deve expor a IDispatch interface.
A maneira recomendada para expor o IDispatch interface é executar as seguintes etapas:
Defina uma interface que declara os membros que você deseja expor a outras soluções. Você pode definir essa interface em seu projeto de suplemento. No entanto, convém definir esta interface em um projeto de biblioteca de classe separada se você deseja expor a classe soluções sem VBA, para que as soluções que chamam o add-in podem fazer referência a interface sem fazer referência a seu projeto de suplemento.
Aplicar o ComVisibleAttribute de atributo a esta interface e definir esse atributo para true.
Modificar sua classe para implementar essa interface.
Aplicar o ClassInterfaceAttribute à sua classe de atributo e definir esse atributo para o None valor de ClassInterfaceType enumeração.
Se você deseja expor a classe para clientes de fora do processo, você também pode precisar fazer o seguinte:
Derive a classe de StandardOleMarshalObject. Para obter mais informações, consulte Classes de expor aos clientes de fora do processo.
Definir o Register for COM interop a propriedade do projeto, onde você define a interface. Isso é necessário somente se você deseja permitir que os clientes usar ligação inicial para chamar o add-in. For more information, see Como: Registrar um componente para interoperabilidade COM.
O exemplo de código a seguir demonstra um AddInUtilities de classe com um ImportData método que pode ser chamado por outras soluções. Para ver este código no contexto de um passo a passo maior, consulte Demonstra Passo a passo: Chamar o código do VBA em um suplemento em nível de aplicativo.
<ComVisible(True)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface
<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities
' This method tries to write a string to cell A1 in the active worksheet.
Public Sub ImportData() Implements IAddInUtilities.ImportData
Dim activeWorksheet As Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim range1 As Excel.Range = activeWorksheet.Range("A1")
range1.Value2 = "This is my data"
End If
End Sub
End Class
[ComVisible(true)]
public interface IAddInUtilities
{
void ImportData();
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : IAddInUtilities
{
// This method tries to write a string to cell A1 in the active worksheet.
public void ImportData()
{
Excel.Worksheet activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
if (activeWorksheet != null)
{
Excel.Range range1 = activeWorksheet.get_Range("A1", System.Type.Missing);
range1.Value2 = "This is my data";
}
}
}
Expondo as Classes de VBA
Quando você executa as etapas acima, o código VBA pode chamar apenas os métodos que você declara na interface do. Código do VBA não é possível chamar qualquer um dos outro métodos na sua classe, incluindo métodos de sua classe obtém a partir de classes base, como Object.
Como alternativa, você pode expor o IDispatch interface, definindo a ClassInterfaceAttribute atributo para o AutoDispatch ou AutoDual valor o ClassInterfaceType enumeração. Se você fizer isso, você precisa declarar os métodos de uma interface separada. No entanto, o código do VBA pode chamar quaisquer métodos públicos e não-static na sua classe, incluindo métodos obtidos a partir de classes base, como Object. Além disso, os clientes de fora do processo usam ligação inicial não podem chamar sua classe.
Expor Classes para clientes de fora do processo
Se você deseja expor uma classe em seu suplemento para clientes de fora do processo, você deve derivar da classe de StandardOleMarshalObject para garantir que os clientes de fora do processo podem chamar seu expostos add-in do objeto. Caso contrário, as tentativas de obter uma instância do objeto exposto em um cliente de out-of-process podem falhar inesperadamente.
Isso ocorre porque todas as chamadas para o modelo de objeto de um aplicativo do Office devem ser feitas no thread da interface do usuário principal, mas as chamadas de um cliente de fora do processo para seu objeto chegarão em um thread de (chamada de procedimento remoto) do RPC arbitrário. O COM o empacotamento de mecanismo na.NET Framework não irá alternar os threads e, em vez disso, ele tentará empacotar a chamada para o objeto no segmento RPC de entrada em vez do segmento de interface do usuário principal. Se o seu objeto é uma instância de uma classe que deriva de StandardOleMarshalObject, chamadas de entrada para o objeto automaticamente são empacotadas para o segmento onde o objeto exposto foi criado, qual será o principal segmento de interface do usuário do aplicativo host.
Para obter mais informações sobre o uso de threads em soluções do Office, consulte Threading suporte no Office.
Substituindo o método RequestComAddInAutomationService
O exemplo de código a seguir demonstra como substituir RequestComAddInAutomationService na ThisAddIn classe em seu add-in. Este exemplo pressupõe que você tenha definido uma classe chamada AddInUtilities que você deseja expor para outras soluções. Para ver este código no contexto de um passo a passo maior, consulte Demonstra Passo a passo: Chamar o código do VBA em um suplemento em nível de aplicativo.
Private utilities As AddInUtilities
Protected Overrides Function RequestComAddInAutomationService() As Object
If utilities Is Nothing Then
utilities = New AddInUtilities()
End If
Return utilities
End Function
private AddInUtilities utilities;
protected override object RequestComAddInAutomationService()
{
if (utilities == null)
utilities = new AddInUtilities();
return utilities;
}
Quando seu suplemento é carregado, o Visual Studio Tools for Office runtime chamadas de RequestComAddInAutomationService método. O runtime atribui o objeto retornado para o Object propriedade de um COMAddIn objeto que representa o add-in. Isso COMAddIn o objeto está disponível para outras soluções do Office e soluções que automatizam o Office.
Acesso a objetos de outras soluções
Para chamar o objeto exposto no seu suplemento, execute as seguintes etapas na solução do cliente:
Obter o COMAddIn objeto que representa o exposto add-in. Os clientes podem acessar todos os suplementos disponíveis, usando o Application.COMAddIns a propriedade no modelo de objeto de host do aplicativo do Office.
Acesso a Object propriedade da COMAddIn objeto. Essa propriedade retorna o objeto exposto do add-in.
Chame os membros do objeto exposto.
A maneira que você usa o valor de retorno de COMAddIn.Object propriedade é diferente para os clientes VBA e não do VBA de clientes. Para clientes de fora do processo, o código adicional é necessário para evitar uma condição de corrida possíveis.
Acessando objetos a partir de soluções do VBA
O exemplo de código a seguir demonstra como usar o VBA para chamar um método que é exposto por um suplemento. Esta macro VBA chama um método chamado ImportData que é definido em um suplemento que é denominado ExcelImportData. Para ver este código no contexto de um passo a passo maior, consulte Demonstra Passo a passo: Chamar o código do VBA em um suplemento em nível de aplicativo.
Sub CallVSTOMethod()
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("ExcelImportData")
Set automationObject = addIn.Object
automationObject.ImportData
End Sub
Acesso a objetos sem VBA soluções
Em uma solução sem VBA, você deve converter o COMAddIn.Object o valor de propriedade para a interface que ele implementa, e em seguida, você pode chamar os métodos expostos no objeto de interface. O exemplo de código a seguir demonstra como chamar o ImportData método a partir de um suplemento diferente que foi criado usando as ferramentas de desenvolvedor do Office em Visual Studio.
Dim addIn As Office.COMAddIn = Globals.ThisAddIn.Application.COMAddIns.Item("ExcelImportData")
Dim utilities As ExcelImportData.IAddInUtilities = TryCast( _
addIn.Object, ExcelImportData.IAddInUtilities)
utilities.ImportData()
object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();
Neste exemplo, se você tentar converter o valor da COMAddIn.Object propriedade para o AddInUtilities classe em vez de IAddInUtilities interface, o código irá lançar um InvalidCastException.
Consulte também
Tarefas
Demonstra Passo a passo: Chamar o código do VBA em um suplemento em nível de aplicativo
Como: Criar projetos do Office em Visual Studio
Conceitos
Personalizando os recursos de interface do usuário usando Interfaces de extensibilidade
Arquitetura dos suplementos de nível de aplicativo
Outros recursos
Os suplementos de nível de aplicativo de programação.
Desenvolvimento de soluções do Office
Histórico de alterações
Date |
History |
Motivo |
---|---|---|
Setembro de 2010 |
Melhor organização de conteúdo e removidas informações redundantes. |
Aprimoramento de informações. |