Ищете способ доступа к глобальным переменным из другого AddIn - PullRequest
0 голосов
/ 01 июля 2019

Итак, я работаю над Excel AddIn (обычный проект VSTO), который использует RibbonBar и некоторые внешние DLL. Поскольку требуется импортировать некоторые пользовательские функции (UDF) в Excel, я прочитал, что вы можете сделать это только путем регистрации его с помощью COM, я сделал это с помощью интерфейса для функций и т. Д. Я сделал регистрацию, как было показано на https://theofficecontext.com/2013/06/08/update-creating-excel-udfs-in-c/ Регистрация работала нормально, и мои импортированные функции можно вызывать внутри Excel. Я использую некоторые диалоги, чтобы позволить пользователю устанавливать некоторые переменные, которые используются для UDF, и я обнаружил, что эти две вещи управляются в отдельных объектах AddIn.

И в этом проблема. Поскольку это два разных объекта, UDF не может получить доступ ко всем материалам, которые я ввел в диалогах.

OnConnection () вызывается из Excel, когда пользовательские функции загружаются при взаимодействии с рабочим листом.


namespace myExcelAddin
{
    public partial class ThisAddIn
    { 
        public static int iUser = 0;
        // .. some other static variables

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
          // some startup work 
        }
     }
}

namespace myExcelAddin
{
  [ComVisible(true)]
  public interface IFunctions
  {
       // ... some functions
  }

    [ComVisible(true)]
    [GuidAttribute("1D3001F4-5307-49A6-98F2-B3B76B3D0AA3"),
    ProgId("myExcelAddin.Functions"),
    ClassInterface(ClassInterfaceType.None),
    ComDefaultInterface(typeof(IFunctions))]

  public partial class Connect : Object, Extensibility.IDTExtensibility2,      IFunctions
  {
       // ... implementation of interface functions
  }

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
 {
       // get a reference to the instance of the add-in
       Application = application as Excel.Application;
       thisAddIn = addInInst;
  }

  [ComRegisterFunctionAttribute]
  public static void RegisterFunction(Type type)
  {
      //... registration work
  }

  [ComUnregisterFunctionAttribute]
  public static void UnregisterFunction(Type type)
  {
     // ... unregistration work
  }
}

Так есть ли возможность получить материал, введенный пользователем? Потому что глобалы для обоих тоже обрабатываются по-разному ...

1 Ответ

0 голосов
/ 11 июля 2019

Кажется, это сложная проблема, но мне приходит в голову несколько идей:

1) Реестр - HKEY_CURRENT_USER, если объем данных достаточно мал

2) Поместите его в файл и прочитайтефайл из другой надстройки

3) Это выглядит наиболее реалистично - используйте Excel для передачи данных - то есть создайте скрытый лист и просто поместите в него данные - но это может быть сложно, если вы не хотите изменять существующую книгу

...