2016-06-03 8 views
0

Я пытаюсь создать приложение Outlook 2013, которое будет загружать другие управляемые добавления из указанного места. В основном это заглушка загрузчика, которая знает, как найти эти другие дополнения, загрузить свои сборки и зарегистрироваться.Создать заглушку загрузчика для OutlookAddInBase

Вот простое доказательство концепции:

using System; 
using System.Linq; 
using System.Windows.Forms; 
using System.ComponentModel; 
using System.Reflection; 
using Microsoft.Office.Tools; 
using Microsoft.Office.Core; 
using Microsoft.Office.Tools.Ribbon; 

[Microsoft.VisualStudio.Tools.Applications.Runtime.StartupObject(0)] 
public class TestAddin : IAddInExtension, IExtension, EntryPoint, ISupportInitialize, IComponent, IDisposable, IBindableComponent 
{ 
    private List<EntryPoint> entrypoints = new List<EntryPoint>(); 
    public TestAddin(Factory factory, IServiceProvider serviceProvider) 
    { 
     Assembly asm = LoadAddinAssembly(); 
     foreach (var type in asm.GetTypes()) 
     { 
      var attr = type.GetCustomAttributes(false).OfType<Microsoft.VisualStudio.Tools.Application.Runtime.StartupObjectAttribute>().FirstOrDefault(); 
      if (attr != null) 
      { 
       var ep = Activator.CreateInstance(
        type, factory, serviceProvider) 
        as Microsoft.Office.Tools.EntryPoint; 
       if (ep != null) 
       { 
        entrypoints.Add(ep); 
       } 
      } 
     } 
    } 

    public void BeginInit() 
    { 
     foreach (var inst in entrypoints) 
      inst.BeginInit(); 
    } 

    // Implement the rest of the interface methods similar to BeginInit above 
} 

Перспектива строит мой класс, мой класс загружает другую надстройку сборку и создает точку входа, а затем прогноз вызывает следующий 3 метод PASSTHROUGH который я тогда называю на к другой надстройке:

  • Initialize()
  • InitializeDataBindings()
  • FinishInitialization()
  • Ни один из них не создает никаких ошибок, но после этого ни один из методов пересылки не вызывается, и добавление, которое я пытаюсь загрузить, никогда ничего не делает.

    Что такое официальное дополнение, отображающее Outlook, которое мне нужно пройти? Или это вообще возможно?

    ответ

    0

    Похоже, что поставщик родительских услуг отслеживает каждую созданную EntryPointPoint. Если вы захватите IHostItemProvider так:

    serviceProvider.GetService(typeof(IHostItemProvider)) 
    

    вы можете использовать отражение, чтобы установить «_entryPoints» (который EntryPoint []), чтобы изменить список точек входа. Вызывающий код будет рассматривать их как обычные EntryPoints, не нужно отслеживать их локально для сквозных вызовов.

    Другая критическая деталь заключается в том, что _entryPoints [0], по-видимому, является единственным, который может регистрировать определенные аспекты пользовательского интерфейса, поэтому он лучше всего работает с OutlookAddInBase (поскольку он реализует логику инициализации логического интерфейса) и делает сквозные вызовы первая точка входа для CreateRibbonExtensibilityObject() и CreateRibbonObjects().

    Кроме того, в манифесте должны быть указаны ленты и формыРегионы, я не нашел никакого способа обойти это, так что это также потребовало создания кучи сквозных заглушек, которые подключаются через отражение.

    Довольно хрупкое решение, но, похоже, оно работает до сих пор (пока Microsoft не изменит внутренности). И из-за того, что _entryPoints [0] так важно, похоже, что каждый загрузочный заглушка может загружать только одно дополнение.

    0

    Если эти дополнительные надстройки не загружаются, вы можете сделать это через коллекцию Application.COMAddIns. Получите объект COMAddIn для надстройки, которую вы хотите загрузить, и установите COMAddIn.Connect = True.

    Также см это для поддерживаемого способа вызова методов другой надстройки:

    https://blogs.msdn.microsoft.com/andreww/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice/

    +0

    Спасибо за информацию. На первый взгляд кажется, что это может иметь некоторую актуальность, но теперь, когда я читаю статью, она оказывается совершенно не связанной с тем, что я пытаюсь выполнить. –

    +0

    COMAddins - это способ сообщить Outlook загружать уже зарегистрированный аддон. Я пытаюсь загрузить addin, не регистрируя его, загружая сборку в уже загруженный и зарегистрированный аддон. Я хочу иметь возможность контролировать, какая версия внешнего добавления загружается во время выполнения. –

    +0

    Можете ли вы пояснить, что вы подразумеваете под «внешним добавлением» и как это отличается от вашей надстройки, загруженной в настоящее время? Как это отличается от ссылочной сборки?Возможно, использование Reflection может быть вариантом? –