проблема с попыткой создать надстройку ssms - PullRequest
3 голосов
/ 29 мая 2010

Я пытаюсь создать надстройку для SSMS 2008 и / или 2008 R2, но сразу столкнулся с проблемой.

Я могу заставить свою надстройку работать и при запуске SSMS заставить ее просто показать окно сообщения.

Однако после загрузки различных примеров кода при попытке сослаться на Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache я получаю исключение нулевой ссылки:

Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands;

Эта проблема возникает при использовании SSMS 2008 или SSMS 2008 R2. Я работаю над Visual Studio 2010.

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

Любые советы / советы приветствуются.

Спасибо

Ответы [ 6 ]

5 голосов
/ 29 мая 2010

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

Некоторую информацию можно найти здесь:

3 голосов
/ 09 сентября 2010

ServiceCache ненадежен - от версии к версии он поддерживает все меньше и меньше, и вероятное исчезнет в какой-то момент.

Если вы пишете надстройку SSMS, вы можете получить доступ к внутренним компонентам, обратившись к VS ApplicationModel. Примерно так:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            _addInInstance = (AddIn)addInInst;
            _applicationObject = _addInInstance.DTE as DTE2;

_applicationObject имеет Команды и другие интересные вещи.

Обратите внимание , что в аргументе application объекта OnConnection передан неверный объект. Вот почему вы должны использовать эту строку, чтобы получить правильный объект: _applicationObject = _addInInstance .DTE как DTE2;

1 голос
/ 20 октября 2010

Хорошо, я нахожу решение, проблема между CLR2.0 и CLR 4.0

.

Источник: http://blogs.msdn.com/b/mshneer/archive/2010/03/19/com-shim-wizards-for-vs-2010.aspx

Отладка надстроек для CLR 2.0 в Visual Studio 2010

У меня возникли проблемы при отладке надстроек если таковые были загружены в CLR 2.0. я нажмете F5, Excel запустится и моя надстройка будет работать, но точки останова не пострадали. Так что я хотел поделиться тем, что происходит и как настроить свою среду в такой способ, которым опыт F5 не полностью сломан.

Там нет магии, как я обычно перейти к отладке общей надстройки - либо с откидной крышкой, либо без откидной. Я установил точка останова в методе OnConnection в файле Connect.cs, откройте проект свойства, перейдите в раздел отладки, выберите «Запустить внешнюю программу» вариант и установить полный путь к моему Офисное приложение (например, "C: \ Program" Files \ Microsoft Office \ Office12 \ EXCEL.EXE "). Далее я щелкните правой кнопкой мыши на узле проекта в Обозреватель решений и выберите «Установить как» Startup Project ". Когда я нажимаю F5 мой достигнута точка останова.

В Visual Studio 2010 точка останова не ударил, если моя надстройка загружена в CLR 2.0. Что происходит в том, что отладчик не может подключиться к обоим CLR 4.0 и CLR 2.0 - это на самом деле нужно перед фактом знать, стоит ли использовать механизм отладки CLR 2.0 или Двигатель отладки CLR 4.0. Когда ты Нажмите F5 отладчик пытается угадать, какой CLR будет запущен в процессе. Эвристика основана на чтении Файл EXE .config, где это необходимо версия времени исполнения обычно указывается и если файл .config не найден чем отладчик запускает CLR 4.0 двигатель отладки. Как мы все знаем Офисные приложения не связаны с любая конкретная версия CLR так эвристика с треском проваливается.

На самом деле есть два способа борьбы с ним - нужно положить .exe.config вместе с файлом сам the.exe, например при отладке Excel 2007 создам Excel.exe.config и оставьте его в "C: \ Program Files \ Microsoft Office \ Office12 ".

Но мой любимый способ борьбы с это другое. В решении Explorer, я нажму правой кнопкой мыши на моем решение узла и выберите «Добавить» -> «Существующий проект» и открытый "C: \ Program Files \ Microsoft Office \ Office12 \ EXCEL.EXE ". Далее я щелкните правой кнопкой мыши на этом недавно добавленном проект и выберите «Установить как запуск» Проект ". Далее я открою свойства для этого проекта и будут установите свойство "Тип отладчика" в «Управляемый (v2.0, v1.1, v1.0)». Сейчас я будет F5 и точка останова, которую я установил в Будет включен метод OnConnection.

1 голос
/ 18 октября 2010

Я боролся с этим некоторое время.

У меня есть надстройка, которая работает в SQL 2008 - написано в VS2008.

Я обновил проект до VS2010 и начал работать над тем, чтобы заставить работать надстройку sql 2008 r2 - я не мог заставить ее работать ни ради любви, ни за деньги.

Я пробовал много разных вещей; * удаление и повторное добавление всех ссылок. * изменение целевой структуры. Не колбаса.

Ничего не сработало .... Пока я не вернулся на VS2008 - я внес изменения. (см. блог Джонатана Кехайяса: https://www.sqlskills.com/blogs/jonathan/sql-server-2012-extended-events-add-in-to-manage-2008r2-instances/)

Ура для новых версий !!

0 голосов
/ 14 октября 2010

Хорошо, спасибо за этот способ, но если у меня есть проект в Framework 3.5, VS2010 не останавливается на достигнутом. Но если я изменю Framework на 4, VS2010 остановится на точке останова. Но CreateToolWindow2 вызывает исключение, потому что это не тот же самый Framework!

Я упрощаю код как минимум:

    /// <summary>Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary>
    /// <param term='application'>Root object of the host application.</param>
    /// <param term='connectMode'>Describes how the Add-in is being loaded.</param>
    /// <param term='addInInst'>Object representing this Add-in.</param>
    /// <seealso class='IDTExtensibility2' />
    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {            
       _addInInstance = (AddIn)addInInst;
       _applicationObject = (DTE2)_addInInstance.DTE;

       if (connectMode == ext_ConnectMode.ext_cm_Startup)//ext_ConnectMode.ext_cm_UISetup)
       {
       }        
    }

    /// <summary>Implements the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification that the host application has completed loading.</summary>
    /// <param term='custom'>Array of parameters that are host application specific.</param>
    /// <seealso class='IDTExtensibility2' />
    public void OnStartupComplete(ref Array custom)
    {            
       Windows2 win2 = this._applicationObject.Windows as Windows2;

       if (win2 != null)
       {
           Assembly asm = Assembly.GetExecutingAssembly();
           AddIn addinobj;

           addinobj = this._applicationObject.AddIns.Item(1);

           object controlObject = null;

           Guid id = new Guid("4c410c93-d66b-495a-9de2-99d5bde4a3b9"); // this guid doesn't seem to matter?
           //Window                 
           Window windowTool = win2.CreateToolWindow2(addinobj,
                                                      asm.Location,
                                                      "MyAddinASupp.UserControl1",    "Zone de test", 
                                                      "{" + id.ToString() + "}",
                                                      ref controlObject);

          windowTool.Visible = true;
       }
    }
0 голосов
/ 14 октября 2010

У меня такая же проблема. Я думаю, что это понравилось в Framework

с рамкой 3.5

ServiceCache.ExtensibilityModel не является нулевым

со структурой 4.0

"ServiceCache.ExtensibilityModel" - это нуль

...