Мой пакет разработан на C ++, VS2015.
Например, я определил некоторую команду в меню проекта и на панели инструментов, когда я запускаю VS, меню панели инструментов в порядке, но команда в меню проекта не появляется, затем я должен нажать любую кнопку в меню панели инструментов, а затем вернитесь в меню проекта.
Я хочу, чтобы мой пакет инициализировал команду меню проекта при запуске Visual Studio или открытии проекта.
Мой код такой
class ATL_NO_VTABLE CYHMExtensionsPackage :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CYHMExtensionsPackage, &CLSID_YHMExtensions>,
// Provides the implementation for IVsPackage to make this COM object into a VS Package.
public IVsPackageImpl<CYHMExtensionsPackage, &CLSID_YHMExtensions>,
public IOleCommandTargetImpl<CYHMExtensionsPackage>,
// Provides consumers of this object with the ability to determine which interfaces support extended error information.
public ATL::ISupportErrorInfoImpl<&__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()
{
}
...
};
Реализуйте следующий метод в вашем файле класса .h и установите точку останова на Sleep
void PostSited(IVsPackageEnums::SetSiteResult /*result*/)
{
Sleep(2500);//initilialize will sleep for some time
}
Вот пример автозагрузки:
[$RootKey$\AutoLoadPackages\{f1536ef8-92ec-443c-9ed7-fdadf150da82}]
"{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000
Более подробную информацию о том, какой гид выбрать, можно найти здесь: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx
Теперь нажмите F5, и вы должны достичь точки останова. Вы можете проверить, правильно ли задан ключ реестра в реестре, перейдя к
HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ VisualStudio \ 14.0Exp_Config \ AutoLoadPackages \ {f1536ef8-92ec-443c-9ed7-fdadf150da82}
(где {f1536ef8-92ec-443c-9ed7-fdadf150da82} — это guid, выбранный вами на шаге 3) и ищущий guid вашего проекта [снова, в моем случае это 03be14ec-1a85-4c5c-a1f4-723d189c2e4c, но ваш должен отличаться ]. Вам нужно будет добавить его вручную, если его там нет.
Пакеты VS должны быть рассчитаны на загрузку при необходимости, а не на принудительную загрузку при запуске VS IDE (devenv.exe). Если бы все заставляли свои пакеты загружаться при запуске VS, вы бы очень долго ждали, чтобы Visual Studio фактически запустился.
Что ты должен делать, использует Раздел реестра AutoLoadPackages, указать, какие контексты активации должны загружать ваш пакет. Это очень легко с проектом пакета на основе VB или C #, так как все, что вам нужно сделать, это добавить Атрибут ProvideAutoLoad к вашему объекту пакета.
Но для пакетов на основе C ++ вам нужно будет вручную отредактировать .pkgdef, чтобы добавить нужные записи.
При этом все команды меню определяются вашим файлом .VSCT, так что, скорее всего, проблема здесь в вашем файле .VSCT и в том, как вы объявляете или добавляете в родительские команды команду меню, которую пытаетесь добавить в контекстное меню проекта.
Использовать Включить трюк с ключом реестра VSIPLogging, чтобы убедиться, что вы определили правильную пару guid: id для интересующего вас контекстного меню.
(подсказка) Если вы используете VS 2015, вы также можете установить это через Расширение Mads Kristensen’s Tools для расширения возможностей. Я рекомендую это, особенно если вы редактируете .pkgdefs, .vsixmanifests и т.п.