Как зарегистрировать UDF / RTD в рамках проекта ВСТО - PullRequest
2 голосов
/ 24 февраля 2011

Все,

Это продолжение моего вопроса здесь .

Моя настройка:

  • Visual Studio 10
  • Язык C #
  • Excel 2007 +
  • Windows XP +

Чего я хотел бы добиться, это:

  • Создание надстройки VSTO для Excel с настраиваемым компонентом ленты и настраиваемой панелью задач
  • Создание RTD-сервера
  • Создание некоторых пользовательских функций, которые переносят вызовы =RTD() для пользователей Excel
  • Пусть клиенты установят надстройку через установку ClickOnce

Помимо последнего требования, я в основном закончил.Единственная проблема, с которой я столкнулся, - это зарегистрировать RTD-сервер и UDF на целевом компьютере без использования regasm.exe.Я в основном хочу, чтобы клиент действительно щелкнул один раз, а затем забыл об этом, тем более что существуют сотни потенциальных пользователей, географически распределенных по всему миру.

Кроме того, поскольку они не являются технически подкованными, я не хочу, чтобы им приходилось регистрировать компоненты COM вручную или что-то в этом роде.

Мне все равно, если UDF и RTD-серверотдельный проект, если я могу включить и зарегистрировать их вместе с надстройкой VSTO через ClickOnce.

Я смотрел на COM без регистрации, но я не мог заставить его работать вмой VSTO addin.Я создал второй проект (library class) и попытался экспортировать и зарегистрировать его для COM-взаимодействия, затем включить его в мой «основной» проект и использовать там: он либо не скомпилируется (Cannot embed interop types from assembly [...] because it is missing either the 'ImportedFromTypeLibAttribute' attribute or the 'PrimaryInteropAssemblyAttribute' attribute)или не регистрироваться.

В Интернете есть множество примеров для отдельных частей моих требований, но ничего для полной суммы.

Я совершенно не в курсе?Может кто-нибудь указать мне правильное направление и в идеале предложить пример кода / конфигурации?

Ура, Че

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

С помощью ссылки, предоставленной Фрэнком выше, я наконец-то закончил делать это в своем ThisAddin классе:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        RegistrationServices regsrv = new RegistrationServices();
        if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
        {
            throw new Exception("Failed to register for COM Interop.");
        }
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        RegistrationServices regsrv = new RegistrationServices();
        if (!regsrv.UnregisterAssembly(GetType().Assembly))
        {
            throw new Exception("Failed to unregister for COM Interop.");
        }
    }

Я знаю, что это не идеально, но, по крайней мере, я точно знаю, что все COM-объекты зарегистрированы, если мой плагин запущен ...

1 голос
/ 02 марта 2011

Это можно сделать с помощью класса установщика, который запускает RegAsm.exe во время установки. Увидеть: Как зарегистрировать .NET CCW с помощью regasm из проекта установки Visual Studio 2008

Надеюсь, это поможет, Frank

...