#c #visual-studio #vspackage
#c #visual-studio #vspackage
Вопрос:
Мой пакет разработан с использованием C , VS2015. Например, я определил некоторую команду в меню проекта и панели инструментов, при запуске VS меню панели инструментов работает нормально, но команда в меню проекта не отображается, тогда я должен нажать любую кнопку в меню панели инструментов, а затем команда в меню проекта возвращается. Я хочу, чтобы мой пакет инициализировал команду меню проекта при запуске Visual Studio или открытии peoject.
Мой код выглядит следующим образом
class ATL_NO_VTABLE CYHMExtensionsPackage :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CYHMExtensionsPackage, amp;CLSID_YHMExtensions>,
// Provides the implementation for IVsPackage to make this COM object into a VS Package.
public IVsPackageImpl<CYHMExtensionsPackage, amp;CLSID_YHMExtensions>,
public IOleCommandTargetImpl<CYHMExtensionsPackage>,
// Provides consumers of this object with the ability to determine which interfaces support extended error information.
public ATL::ISupportErrorInfoImpl<amp;__uuidof(IVsPackage)>
{
public:
// Provides a portion of the implementation of IUnknown, in particular the list of interfaces
// the CYHMExtensionsPackage object will support via QueryInterface
BEGIN_COM_MAP(CYHMExtensionsPackage)
COM_INTERFACE_ENTRY(IVsPackage)
COM_INTERFACE_ENTRY(IOleCommandTarget)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
VSL_DECLARE_NOT_COPYABLE(CYHMExtensionsPackage)
public:
CYHMExtensionsPackage():m_dwEditorCookie(0), m_MyToolWindow(GetVsSiteCache())
{
GetYHMVSSolution();
}
~CYHMExtensionsPackage()
{
}
...
};
Ответ №1:
- Возможно, вам не следует размещать код, инициализирующий другие методы, в конструкторе для вашего класса.
Реализуйте следующий метод в вашем файле class .h и установите точку останова в режиме ожидания
void PostSited(IVsPackageEnums::SetSiteResult /*result*/)
{
Sleep(2500);//initilialize will sleep for some time
}
- Убедитесь, что в вашем файле projects .pkgdef установлен соответствующий раздел реестра автозагрузки, в моем случае это после создания проекта vspackage с помощью мастера {f1536ef8-92ec-443c-9ed7-fdadf150da82}, а затем введите guid вашего проекта, где указано 03be14ec-1a85-4c5c-a1f4- 723d189c2e4c
Вот пример автоматической загрузки:
[$RootKey$AutoLoadPackages{f1536ef8-92ec-443c-9ed7-fdadf150da82}]
"{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000
-
Дополнительную информацию о том, какой идентификатор guid выбрать, можно найти здесь: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx
-
Теперь нажмите F5, и вы должны достичь точки останова. Вы можете проверить, правильно ли задан раздел реестра в реестре, перейдя к
HKEY_CURRENT_USERSOFTWAREMicrosoftVisualStudio14.0Exp_ConfigAutoLoadPackages{f1536ef8-92ec-443c-9ed7-fdadf150da82}
(где {f1536ef8-92ec-443c-9ed7-fdadf150da82} — это идентификатор guid, выбранный вами на шаге 3) и ищем идентификатор guid вашего проекта [опять же, в моем случае это 03be14ec-1a85-4c5c-a1f4-723d189c2e4c, но ваш должен быть другим]. Вам нужно будет добавить его вручную, если его там нет.
Ответ №2:
Пакеты VS должны быть спроектированы так, чтобы загружаться при необходимости, а не принудительно загружаться при запуске VS IDE (devenv.exe) запускается. Если бы все принудительно загружали свои пакеты при запуске VS, вам пришлось бы очень долго ждать реального запуска Visual Studio.
Что вам следует делать, так это использовать раздел реестра AutoLoadPackages, чтобы указать, какие контексты активации должны загружать ваш пакет. Это очень просто с проектом пакета на основе VB или C #, так как все, что вам нужно сделать, это добавить атрибут ProvideAutoLoad к вашему объекту пакета.
Но для пакетов на основе C вам нужно будет вручную отредактировать .pkgdef, чтобы добавить нужные записи.
Как бы то ни было, команды меню определяются вашим .Файл VSCT, так что, скорее всего, проблема здесь в вашем.Файл VSCT и как вы объявляете или создаете родительскую команду меню, которую пытаетесь добавить в контекстное меню проекта.
Используйте хитрость с ключом реестра EnableVSIPLogging, чтобы убедиться, что вы определили правильную пару guid: id для интересующего вас контекстного меню.
(подсказка) Если вы используете VS 2015, вы также можете настроить это с помощью расширения Мадса Кристенсена Extensibility Tools. Я рекомендую это, особенно если вы редактируете .pkgdefs, .vsixmanifests и тому подобное.